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