deriving-trans-0.2.1.0: Derive instances for monad transformer stacks
Safe HaskellNone
LanguageHaskell2010

Control.Monad.Trans.Elevator

Contents

Synopsis

Documentation

newtype Elevator t m a Source #

A newtype wrapper for monad transformers.

Access instances of the inner monad m.

Constructors

Ascend 

Fields

Instances

Instances details
(Monad (t m), MonadTrans t, MonadBase b m) => MonadBase b (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

liftBase :: b α -> Elevator t m α #

(Monad (t m), MonadTransControl t, MonadBaseControl b m) => MonadBaseControl b (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Associated Types

type StM (Elevator t m) a #

Methods

liftBaseWith :: (RunInBase (Elevator t m) b -> b a) -> Elevator t m a #

restoreM :: StM (Elevator t m) a -> Elevator t m a #

(Monad (t m), MonadTransControl t, MonadWriter w m) => MonadWriter w (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

writer :: (a, w) -> Elevator t m a #

tell :: w -> Elevator t m () #

listen :: Elevator t m a -> Elevator t m (a, w) #

pass :: Elevator t m (a, w -> w) -> Elevator t m a #

(Monad (t m), MonadTrans t, MonadState s m) => MonadState s (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

get :: Elevator t m s #

put :: s -> Elevator t m () #

state :: (s -> (a, s)) -> Elevator t m a #

(Monad (t m), MonadTransControl t, MonadReader r m) => MonadReader r (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

ask :: Elevator t m r #

local :: (r -> r) -> Elevator t m a -> Elevator t m a #

reader :: (r -> a) -> Elevator t m a #

(Monad (t m), MonadTransControl t, MonadError e m) => MonadError e (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

throwError :: e -> Elevator t m a #

catchError :: Elevator t m a -> (e -> Elevator t m a) -> Elevator t m a #

MonadTrans t => MonadTrans (Elevator t) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

lift :: Monad m => m a -> Elevator t m a #

MonadTransControl t => MonadTransControl (Elevator t) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Associated Types

type StT (Elevator t) a #

Methods

liftWith :: Monad m => (Run (Elevator t) -> m a) -> Elevator t m a #

restoreT :: Monad m => m (StT (Elevator t) a) -> Elevator t m a #

Monad (t m) => Monad (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

(>>=) :: Elevator t m a -> (a -> Elevator t m b) -> Elevator t m b #

(>>) :: Elevator t m a -> Elevator t m b -> Elevator t m b #

return :: a -> Elevator t m a #

Functor (t m) => Functor (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

fmap :: (a -> b) -> Elevator t m a -> Elevator t m b #

(<$) :: a -> Elevator t m b -> Elevator t m a #

Applicative (t m) => Applicative (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

pure :: a -> Elevator t m a #

(<*>) :: Elevator t m (a -> b) -> Elevator t m a -> Elevator t m b #

liftA2 :: (a -> b -> c) -> Elevator t m a -> Elevator t m b -> Elevator t m c #

(*>) :: Elevator t m a -> Elevator t m b -> Elevator t m b #

(<*) :: Elevator t m a -> Elevator t m b -> Elevator t m a #

(Monad (t m), MonadTrans t, MonadIO m) => MonadIO (Elevator t m) Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

Methods

liftIO :: IO a -> Elevator t m a #

type StT (Elevator t) a Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

type StT (Elevator t) a = StT t a
type StM (Elevator t m) a Source # 
Instance details

Defined in Control.Monad.Trans.Elevator

type StM (Elevator t m) a = StM m (StT t a)

Examples

Example 1: Recover submerged instances

Let's assume you want to define a monad transformer stack.

newtype StackT m a = StackT { unStackT :: ReaderT Char (ReaderT Bool m) a }
  deriving newtype (Functor, Applicative Monad)

Now you want to expose the inner (MonadReader Bool) instance with (StackT m).

Normally it's shadowed by the (MonadReader Char) instance, but we can use Elevator to access the inner transformer.

  deriving (MonadReader Bool) via (Elevator (ReaderT Char) (ReaderT Bool m))

Example 2: Custom transformer without boilerplate

Let's assume you have defined a monad transformer.

newtype CustomT m a = CustomT { unComposeT :: IdentityT m a }
  deriving newtype (Functor, Applicative Monad)
  deriving newtype (MonadTrans, MonadTransControl)

runCustomT :: CustomT m a -> m a
runCustomT = runIdentityT . unComposeT

Now you want to use this monad transformer in a transformer stack.

newtype StackT m a = { unStackT :: CustomT (ReaderT Bool m) a }
  deriving newtype (Functor, Applicative Monad)
  deriving newtype (MonadTrans, MonadTransControl)

Unfortunately we can't derive a Monad m => MonadReader Bool (StackT m) instance with GeneralizedNewtypeDeriving, without also adding the instance to CustomT.

To still derive this trivial instance we can use Elevator with DerivingVia.

  deriving (MonadReader Bool) via (Elevator CustomT (ReaderT Bool m))