|
Packit |
78abc6 |
{-# LANGUAGE CPP #-}
|
|
Packit |
78abc6 |
{-# LANGUAGE UnicodeSyntax #-}
|
|
Packit |
78abc6 |
{-# LANGUAGE MultiParamTypeClasses #-}
|
|
Packit |
78abc6 |
{-# LANGUAGE FunctionalDependencies #-}
|
|
Packit |
78abc6 |
{-# LANGUAGE FlexibleInstances #-}
|
|
Packit |
78abc6 |
{-# LANGUAGE UndecidableInstances #-}
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
#if MIN_VERSION_base(4,4,0)
|
|
Packit |
78abc6 |
{-# LANGUAGE Safe #-}
|
|
Packit |
78abc6 |
#endif
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
#if MIN_VERSION_transformers(0,4,0)
|
|
Packit |
78abc6 |
-- Hide warnings for the deprecated ErrorT transformer:
|
|
Packit |
78abc6 |
{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}
|
|
Packit |
78abc6 |
#endif
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
module Control.Monad.Base
|
|
Packit |
78abc6 |
( MonadBase(..)
|
|
Packit |
78abc6 |
, liftBaseDefault
|
|
Packit |
78abc6 |
) where
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
import Data.Monoid
|
|
Packit |
78abc6 |
import Data.Functor.Identity
|
|
Packit |
78abc6 |
import Control.Applicative (Applicative(..))
|
|
Packit |
78abc6 |
import Control.Monad.Trans.Class
|
|
Packit |
78abc6 |
import Control.Monad.Trans.Identity
|
|
Packit |
78abc6 |
import Control.Monad.Trans.Maybe
|
|
Packit |
78abc6 |
import Control.Monad.Trans.List
|
|
Packit |
78abc6 |
import Control.Monad.Trans.Reader
|
|
Packit |
78abc6 |
import qualified Control.Monad.Trans.Writer.Lazy as L
|
|
Packit |
78abc6 |
import qualified Control.Monad.Trans.Writer.Strict as S
|
|
Packit |
78abc6 |
import qualified Control.Monad.Trans.State.Lazy as L
|
|
Packit |
78abc6 |
import qualified Control.Monad.Trans.State.Strict as S
|
|
Packit |
78abc6 |
import qualified Control.Monad.Trans.RWS.Lazy as L
|
|
Packit |
78abc6 |
import qualified Control.Monad.Trans.RWS.Strict as S
|
|
Packit |
78abc6 |
import Control.Monad.Trans.Error
|
|
Packit |
78abc6 |
import Control.Monad.Trans.Cont
|
|
Packit |
78abc6 |
import Control.Monad.Trans.Except
|
|
Packit |
78abc6 |
#if !MIN_VERSION_base(4,4,0) && HS_TRANSFORMERS_BASE__ORPHANS
|
|
Packit |
78abc6 |
import Control.Monad (ap)
|
|
Packit |
78abc6 |
import qualified Control.Monad.ST.Lazy as L
|
|
Packit |
78abc6 |
import qualified Control.Monad.ST.Strict as S
|
|
Packit |
78abc6 |
#endif
|
|
Packit |
78abc6 |
#if MIN_VERSION_base(4,4,0)
|
|
Packit |
78abc6 |
import qualified Control.Monad.ST.Lazy.Safe as L
|
|
Packit |
78abc6 |
import qualified Control.Monad.ST.Safe as S
|
|
Packit |
78abc6 |
#endif
|
|
Packit |
78abc6 |
import Control.Monad.STM (STM)
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
class (Applicative b, Applicative m, Monad b, Monad m)
|
|
Packit |
78abc6 |
⇒ MonadBase b m | m → b where
|
|
Packit |
78abc6 |
-- | Lift a computation from the base monad
|
|
Packit |
78abc6 |
liftBase ∷ b α → m α
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
#define BASE(M) \
|
|
Packit |
78abc6 |
instance MonadBase (M) (M) where liftBase = id
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
BASE(IO)
|
|
Packit |
78abc6 |
BASE(Maybe)
|
|
Packit |
78abc6 |
BASE(Either e)
|
|
Packit |
78abc6 |
BASE([])
|
|
Packit |
78abc6 |
BASE((→) r)
|
|
Packit |
78abc6 |
BASE(Identity)
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
BASE(STM)
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
#if !MIN_VERSION_base(4,4,0) && HS_TRANSFORMERS_BASE__ORPHANS
|
|
Packit |
78abc6 |
instance Applicative (L.ST s) where
|
|
Packit |
78abc6 |
pure = return
|
|
Packit |
78abc6 |
(<*>) = ap
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
instance Applicative (S.ST s) where
|
|
Packit |
78abc6 |
pure = return
|
|
Packit |
78abc6 |
(<*>) = ap
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
BASE(L.ST s)
|
|
Packit |
78abc6 |
BASE(S.ST s)
|
|
Packit |
78abc6 |
#endif
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
#if MIN_VERSION_base(4,4,0)
|
|
Packit |
78abc6 |
BASE(L.ST s)
|
|
Packit |
78abc6 |
BASE(S.ST s)
|
|
Packit |
78abc6 |
#endif
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
#undef BASE
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
-- | Can be used as a default implementation for 'liftBase'.
|
|
Packit |
78abc6 |
--
|
|
Packit |
78abc6 |
-- Note that: @liftBaseDefault = 'lift' . 'liftBase'@
|
|
Packit |
78abc6 |
liftBaseDefault ∷ (MonadTrans t, MonadBase b m) ⇒ b α → t m α
|
|
Packit |
78abc6 |
liftBaseDefault = lift . liftBase
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
#define TRANS(T) \
|
|
Packit |
78abc6 |
instance (MonadBase b m) ⇒ MonadBase b (T m) where liftBase = liftBaseDefault
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
TRANS(IdentityT)
|
|
Packit |
78abc6 |
TRANS(MaybeT)
|
|
Packit |
78abc6 |
TRANS(ListT)
|
|
Packit |
78abc6 |
TRANS(ReaderT r)
|
|
Packit |
78abc6 |
TRANS(L.StateT s)
|
|
Packit |
78abc6 |
TRANS(S.StateT s)
|
|
Packit |
78abc6 |
TRANS(ContT r)
|
|
Packit |
78abc6 |
TRANS(ExceptT e)
|
|
Packit |
78abc6 |
#undef TRANS
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
#define TRANS_CTX(CTX, T) \
|
|
Packit |
78abc6 |
instance (CTX, MonadBase b m) ⇒ MonadBase b (T m) where liftBase = liftBaseDefault
|
|
Packit |
78abc6 |
|
|
Packit |
78abc6 |
TRANS_CTX(Monoid w, L.WriterT w)
|
|
Packit |
78abc6 |
TRANS_CTX(Monoid w, S.WriterT w)
|
|
Packit |
78abc6 |
TRANS_CTX(Monoid w, L.RWST r w s)
|
|
Packit |
78abc6 |
TRANS_CTX(Monoid w, S.RWST r w s)
|
|
Packit |
78abc6 |
TRANS_CTX(Error e, ErrorT e)
|
|
Packit |
78abc6 |
#undef TRANS_CTX
|