module Plat.Errors ( Errors, mapE, runErrors, throwE ) where import Control.Monad import Data.Monoid data Errors e a = Errors e | Result a instance Monad (Errors e) where return = Result Result x >>= f = f x Errors e >>= _ = Errors e instance Monoid e => MonadPlus (Errors e) where mzero = Errors mempty Result x `mplus` _ = Result x Errors _ `mplus` Result x = Result x Errors e `mplus` Errors e' = Errors (e `mappend` e') throwE :: e -> Errors e a throwE = Errors runErrors :: Errors e a -> Either e a runErrors (Errors e) = Left e runErrors (Result x) = Right x mapE :: (e -> f) -> Errors e a -> Errors f a mapE h (Errors e) = Errors (h e) mapE h (Result x) = Result x