module Control.Monad.Base (
MonadBase(..)
) where
import Data.Monoid
import Data.Functor.Identity
import Control.Applicative
import qualified Control.Monad.ST.Lazy as L
import qualified Control.Monad.ST.Strict as S
import Control.Monad.Trans.Class
import Control.Monad.Trans.Identity
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.List
import Control.Monad.Trans.Reader
import qualified Control.Monad.Trans.Writer.Lazy as L
import qualified Control.Monad.Trans.Writer.Strict as S
import qualified Control.Monad.Trans.State.Lazy as L
import qualified Control.Monad.Trans.State.Strict as S
import qualified Control.Monad.Trans.RWS.Lazy as L
import qualified Control.Monad.Trans.RWS.Strict as S
import Control.Monad.Trans.Error
import Control.Monad.Trans.Cont
class (Applicative μ, Monad μ,
Applicative η, Monad η) ⇒ MonadBase η μ | μ → η where
liftBase ∷ η α → μ α
instance MonadBase IO IO where liftBase = id
instance MonadBase Identity Identity where liftBase = id
instance MonadBase Maybe Maybe where liftBase = id
instance MonadBase (Either e) (Either e) where liftBase = id
instance MonadBase [] [] where liftBase = id
instance MonadBase (L.ST s) (L.ST s) where liftBase = id
instance MonadBase (S.ST s) (S.ST s) where liftBase = id
instance MonadBase η μ ⇒ MonadBase η (IdentityT μ) where
liftBase = lift . liftBase
instance MonadBase η μ ⇒ MonadBase η (MaybeT μ) where
liftBase = lift . liftBase
instance MonadBase η μ ⇒ MonadBase η (ListT μ) where
liftBase = lift . liftBase
instance MonadBase η μ ⇒ MonadBase η (ReaderT r μ) where
liftBase = lift . liftBase
instance (Monoid w, MonadBase η μ) ⇒ MonadBase η (L.WriterT w μ) where
liftBase = lift . liftBase
instance (Monoid w, MonadBase η μ) ⇒ MonadBase η (S.WriterT w μ) where
liftBase = lift . liftBase
instance MonadBase η μ ⇒ MonadBase η (L.StateT s μ) where
liftBase = lift . liftBase
instance MonadBase η μ ⇒ MonadBase η (S.StateT s μ) where
liftBase = lift . liftBase
instance (Monoid w, MonadBase η μ) ⇒ MonadBase η (L.RWST r w s μ) where
liftBase = lift . liftBase
instance (Monoid w, MonadBase η μ) ⇒ MonadBase η (S.RWST r w s μ) where
liftBase = lift . liftBase
instance (Error e, MonadBase η μ) ⇒ MonadBase η (ErrorT e μ) where
liftBase = lift . liftBase
instance MonadBase η μ ⇒ MonadBase η (ContT r μ) where
liftBase = lift . liftBase