rhine-0.9: src/FRP/Rhine/ClSF/Except/Util.hs
{- |
Utilities for 'FRP.Rhine.ClSF.Except' that need not be exported.
-}
module FRP.Rhine.ClSF.Except.Util where
-- transformers
import Control.Monad.Trans.Except
import Control.Monad.Trans.Reader
-- | Commute a 'ReaderT' layer past an 'ExceptT' layer.
commuteExceptReader :: ExceptT e (ReaderT r m) a -> ReaderT r (ExceptT e m) a
commuteExceptReader a = ReaderT $ \r -> ExceptT $ runReaderT (runExceptT a) r
-- | Commute the effects of the 'ReaderT' and the 'ExceptT' monad.
commuteReaderExcept :: ReaderT r (ExceptT e m) a -> ExceptT e (ReaderT r m) a
commuteReaderExcept a = ExceptT $ ReaderT $ \r -> runExceptT $ runReaderT a r