Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Demo where
- import qualified Data.Set as S
- import Control.Monad.State
- import Control.Monad.Except
- type Input = String
- type ProcessedInput = String
- type Output = S.Set ProcessedInput
- data Error = InvalidFormat Input
- | DuplicateInput ProcessedInput
- deriving (Show)
- processInput :: Input -> Maybe ProcessedInput
- processInput "" = Nothing
- processInput s = Just (tail s)
- buildInputs :: [Input] -> Either Error Output
- buildInputs is = runExcept $ execStateT builder S.empty
- where builder = sequence (map buildInputs' is)
- buildInputs' :: Input -> StateT Output (Except Error) ()
- buildInputs' i = case processInput i of
- Nothing -> throwError (InvalidFormat i)
- Just p -> ifM (gets $ S.member p) (throwError $ DuplicateInput p) (modify $ S.insert p)
- buildInputs2 :: [Input] -> Either Error Output
- buildInputs2 is = runExcept $ execStateT (buildInputs2' is) S.empty
- buildInputs2' :: [Input] -> StateT Output (Except Error) ()
- buildInputs2' [] = return ()
- buildInputs2' (i:is) = case processInput i of
- Nothing -> throwError (InvalidFormat i)
- Just p -> do
- ifM (gets $ S.member p) (throwError $ DuplicateInput p) (modify $ S.insert p)
- buildInputs2' is
- ifM :: Monad m => m Bool -> m a -> m a -> m a
- ifM cond t f = cond >>= \c -> if c then t else f
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement