module Control.Monad.Trans.Region.Instances.MonadsTF where
import Control.Monad.Cont.Class ( MonadCont, callCC )
import Control.Monad.Error.Class ( MonadError, ErrorType, throwError, catchError )
import Control.Monad.RWS.Class ( MonadRWS )
import Control.Monad.Reader.Class ( MonadReader, EnvType, ask, local )
import Control.Monad.State.Class ( MonadState, StateType, get, put )
import Control.Monad.Writer.Class ( MonadWriter, WriterType, tell, listen, pass )
import Control.Monad.Trans ( lift )
import Data.Function.Unicode ( (∘) )
import Control.Monad.Trans.Region ( RegionT
, liftCallCC
, liftCatch
, mapRegionT
)
instance MonadCont pr ⇒ MonadCont (RegionT s pr) where
callCC = liftCallCC callCC
instance MonadError pr ⇒ MonadError (RegionT s pr) where
type ErrorType (RegionT s pr) = ErrorType pr
throwError = lift ∘ throwError
catchError = liftCatch catchError
instance MonadRWS pr ⇒ MonadRWS (RegionT s pr)
instance MonadReader pr ⇒ MonadReader (RegionT s pr) where
type EnvType (RegionT s pr) = EnvType pr
ask = lift ask
local = mapRegionT ∘ local
instance MonadWriter pr ⇒ MonadWriter (RegionT s pr) where
type WriterType (RegionT s pr) = WriterType pr
tell = lift ∘ tell
listen = mapRegionT listen
pass = mapRegionT pass
instance MonadState pr ⇒ MonadState (RegionT s pr) where
type StateType (RegionT s pr) = StateType pr
get = lift get
put = lift ∘ put