llvm-general-3.3.0.0: src/Control/Monad/Phased.hs
{-# LANGUAGE
FlexibleInstances,
MultiParamTypeClasses,
UndecidableInstances
#-}
module Control.Monad.Phased (
MonadPhased(..),
PhasedT(..),
runPhasedT,
forInterleavedM,
iap,
defer,
runInterleaved,
mapPhasedT
) where
import Control.Monad
import Control.Monad.Trans.Phased
import Control.Monad.Trans.Class
import Control.Monad.State.Class
import Control.Monad.Reader.Class
import Control.Monad.Error.Class
import Control.Monad.Phased.Class
instance MonadState s m => MonadState s (PhasedT m) where
state = lift . state
instance MonadReader r m => MonadReader r (PhasedT m) where
ask = lift ask
local f = PhasedT . local f . liftM (either (Left . local f) Right) . unPhasedT
instance (MonadError e m) => MonadError e (PhasedT m) where
throwError = lift . throwError
catchError pa ph = mapPhasedT (`catchError` (unPhasedT . ph)) pa