Blame src/Control/Monad/Base.hs

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