plailude-0.3.0: src/Plailude/Control/Monad.hs
{- |
Module : $Header$
Description : Monads. dealwithit.jpeg.
Copyright : (c) plaimi 2014
License : GPL-3
Maintainer : plailude@plaimi.net
-} module Plailude.Control.Monad where
import Control.Monad
(
liftM,
)
import Control.Monad.Except
(
MonadError,
catchError,
throwError,
)
retreat :: (Monad m, Monad n) => m a -> m (n a)
-- | Retreat the value a of a 'Monad' m further into the 'Monad' burrito by
-- injecting it into yet another 'Monad' n, giving us m (n a).
retreat = liftM return
erretreat :: (MonadError e m, MonadError e n) => m a -> m (n a)
-- | 'retreat' the value a of a 'MonadError' m further into the 'MonadError'
-- burrito by injecting it into yet another 'MonadError' n, giving us m (n a).
-- If there's an error, it is rethrown inside n.
erretreat a = retreat a `catchError` (return . throwError)