multistate-0.8.0.3: like mtl's ReaderT / WriterT / StateT, but more than one contained value/type.

Safe Haskell | Safe
Language | Haskell2010

Control.Monad.Trans.MultiReader

Contents

- MultiReaderT
- MonadMultiReader class
- run-functions
- with-functions (single reader)
- with-functions (multiple readers)
- without-function (single reader)
- inflate-function (run ReaderT in MultiReaderT)
- other functions

Description

The multi-valued version of mtl's Reader / ReaderT / MonadReader

Synopsis

- newtype MultiReaderT x m a = MultiReaderT {
  - runMultiReaderTRaw :: StateT (HList x) m a
  }
- type MultiReaderTNull = MultiReaderT '[]
- type MultiReader x = MultiReaderT x Identity
- class Monad m => MonadMultiReader a m where
  - mAsk :: m a
- runMultiReaderT :: Monad m => HList r -> MultiReaderT r m a -> m a
- runMultiReaderT_ :: Functor m => HList r -> MultiReaderT r m a -> m ()
- runMultiReaderTNil :: Monad m => MultiReaderT '[] m a -> m a
- runMultiReaderTNil_ :: Functor m => MultiReaderT '[] m a -> m ()
- withMultiReader :: Monad m => r -> MultiReaderT (r ': rs) m a -> MultiReaderT rs m a
- withMultiReader_ :: (Functor m, Monad m) => r -> MultiReaderT (r ': rs) m a -> MultiReaderT rs m ()
- withMultiReaders :: Monad m => HList r1 -> MultiReaderT (Append r1 r2) m a -> MultiReaderT r2 m a
- withMultiReaders_ :: (Functor m, Monad m) => HList r1 -> MultiReaderT (Append r1 r2) m a -> MultiReaderT r2 m ()
- withoutMultiReader :: Monad m => MultiReaderT rs m a -> MultiReaderT (r ': rs) m a
- inflateReader :: (Monad m, ContainsType r rs) => ReaderT r m a -> MultiReaderT rs m a
- mapMultiReaderT :: (m (a, HList w) -> m' (a', HList w)) -> MultiReaderT w m a -> MultiReaderT w m' a'
- mGetRaw :: Monad m => MultiReaderT a m (HList a)
- mPutRaw :: Monad m => HList s -> MultiReaderT s m ()

# MultiReaderT

newtype MultiReaderT x m a Source #

A Reader transformer monad patameterized by:

- x - The list of types constituting the environment / input (to be read),
- m - The inner monad.

`MultiReaderT` corresponds to mtl's `ReaderT`, but can contain a heterogenous list of types.

This heterogenous list is represented using Types.Data.List, i.e:

- `'[]` - The empty list,
- `a ': b` - A list where `a` is an arbitrary type and `b` is the rest list.

For example,

    MultiReaderT '[Int, Bool] :: (* -> *) -> (* -> *)

is a Reader transformer containing the types [Int, Bool].

Constructors

MultiReaderT |

Fields

- runMultiReaderTRaw :: StateT (HList x) m a

#### Instances

Instances details

MonadBase b m => MonadBase b (MultiReaderT r m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods liftBase :: b α -> MultiReaderT r m α Source #
MonadBaseControl b m => MonadBaseControl b (MultiReaderT r m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Associated Types type StM (MultiReaderT r m) a Source # Methods liftBaseWith :: (RunInBase (MultiReaderT r m) b -> b a) -> MultiReaderT r m a Source # restoreM :: StM (MultiReaderT r m) a -> MultiReaderT r m a Source #
(Monad m, ContainsType a c) => MonadMultiGet a (MultiReaderT c m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods mGet :: MultiReaderT c m a Source #
(Monad m, ContainsType a c) => MonadMultiReader a (MultiReaderT c m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods mAsk :: MultiReaderT c m a Source #
MonadState s m => MonadState s (MultiReaderT c m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods get :: MultiReaderT c m s put :: s -> MultiReaderT c m () state :: (s -> (a, s)) -> MultiReaderT c m a
MonadWriter w m => MonadWriter w (MultiReaderT c m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods writer :: (a, w) -> MultiReaderT c m a tell :: w -> MultiReaderT c m () listen :: MultiReaderT c m a -> MultiReaderT c m (a, w) pass :: MultiReaderT c m (a, w -> w) -> MultiReaderT c m a
MonadTrans (MultiReaderT x) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods lift :: Monad m => m a -> MultiReaderT x m a
MonadTransControl (MultiReaderT r) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Associated Types type StT (MultiReaderT r) a Source # Methods liftWith :: Monad m => (Run (MultiReaderT r) -> m a) -> MultiReaderT r m a Source # restoreT :: Monad m => m (StT (MultiReaderT r) a) -> MultiReaderT r m a Source #
Monad m => Monad (MultiReaderT x m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods (>>=) :: MultiReaderT x m a -> (a -> MultiReaderT x m b) -> MultiReaderT x m b (>>) :: MultiReaderT x m a -> MultiReaderT x m b -> MultiReaderT x m b return :: a -> MultiReaderT x m a
Functor f => Functor (MultiReaderT x f) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods fmap :: (a -> b) -> MultiReaderT x f a -> MultiReaderT x f b (<$) :: a -> MultiReaderT x f b -> MultiReaderT x f a
MonadFix m => MonadFix (MultiReaderT r m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods mfix :: (a -> MultiReaderT r m a) -> MultiReaderT r m a
(Applicative m, Monad m) => Applicative (MultiReaderT x m) Source # |

Instance details

Defined in Control.Monad.Trans.MultiReader.Lazy

Methods

pure :: a -> MultiReaderT x m a

(<*>) :: MultiReaderT x m (a -> b) -> MultiReaderT x m a -> MultiReaderT x m b

liftA2 :: (a -> b -> c) -> MultiReaderT x m a -> MultiReaderT x m b -> MultiReaderT x m c

(*>) :: MultiReaderT x m a -> MultiReaderT x m b -> MultiReaderT x m b

(<*) :: MultiReaderT x m a -> MultiReaderT x m b -> MultiReaderT x m a

(Functor m, Applicative m, MonadPlus m) => Alternative (MultiReaderT c m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods empty :: MultiReaderT c m a (<|>) :: MultiReaderT c m a -> MultiReaderT c m a -> MultiReaderT c m a some :: MultiReaderT c m a -> MultiReaderT c m [a] many :: MultiReaderT c m a -> MultiReaderT c m [a]
MonadPlus m => MonadPlus (MultiReaderT c m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods mzero :: MultiReaderT c m a mplus :: MultiReaderT c m a -> MultiReaderT c m a -> MultiReaderT c m a
MonadIO m => MonadIO (MultiReaderT c m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods liftIO :: IO a -> MultiReaderT c m a
type StT (MultiReaderT r) a Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy type StT (MultiReaderT r) a = (a, HList r)
type StM (MultiReaderT r m) a Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy type StM (MultiReaderT r m) a = ComposeSt (MultiReaderT r) m a

type MultiReaderTNull = MultiReaderT '[] Source #

A MultiReader transformer carrying an empty state.

type MultiReader x = MultiReaderT x Identity Source #

A reader monad parameterized by the list of types x of the environment / input to carry.

Similar to `Reader r = ReaderT r Identity`

# MonadMultiReader class

class Monad m => MonadMultiReader a m where Source #

All methods must be defined.

The idea is: Any monad stack is instance of `MonadMultiReader a`, iff the stack contains a `MultiReaderT x` with a element of x.

Methods

mAsk Source #

Arguments

:: m a | Access to a specific type in the environment.

#### Instances

Instances details

(MonadTrans t, Monad (t m), MonadMultiReader a m) => MonadMultiReader a (t m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Class Methods mAsk :: t m a Source #
(Monad m, ContainsType a c) => MonadMultiReader a (MultiReaderT c m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Strict Methods mAsk :: MultiReaderT c m a Source #
(Monad m, ContainsType a c) => MonadMultiReader a (MultiReaderT c m) Source # |
Instance details Defined in Control.Monad.Trans.MultiReader.Lazy Methods mAsk :: MultiReaderT c m a Source #
(Monad m, ContainsType a r) => MonadMultiReader a (MultiRWST r w s m) Source # |
Instance details Defined in Control.Monad.Trans.MultiRWS.Strict Methods mAsk :: MultiRWST r w s m a Source #
(Monad m, ContainsType a r) => MonadMultiReader a (MultiRWST r w s m) Source # |
Instance details Defined in Control.Monad.Trans.MultiRWS.Lazy Methods mAsk :: MultiRWST r w s m a Source #

# run-functions

runMultiReaderT :: Monad m => HList r -> MultiReaderT r m a -> m a Source #

runMultiReaderT_ :: Functor m => HList r -> MultiReaderT r m a -> m () Source #

runMultiReaderTNil :: Monad m => MultiReaderT '[] m a -> m a Source #

runMultiReaderTNil_ :: Functor m => MultiReaderT '[] m a -> m () Source #

# with-functions (single reader)

withMultiReader :: Monad m => r -> MultiReaderT (r ': rs) m a -> MultiReaderT rs m a Source #

withMultiReader_ :: (Functor m, Monad m) => r -> MultiReaderT (r ': rs) m a -> MultiReaderT rs m () Source #

# with-functions (multiple readers)

withMultiReaders :: Monad m => HList r1 -> MultiReaderT (Append r1 r2) m a -> MultiReaderT r2 m a Source #

withMultiReaders_ :: (Functor m, Monad m) => HList r1 -> MultiReaderT (Append r1 r2) m a -> MultiReaderT r2 m () Source #

# without-function (single reader)

withoutMultiReader :: Monad m => MultiReaderT rs m a -> MultiReaderT (r ': rs) m a Source #

# inflate-function (run ReaderT in MultiReaderT)

inflateReader :: (Monad m, ContainsType r rs) => ReaderT r m a -> MultiReaderT rs m a Source #

# other functions

mapMultiReaderT :: (m (a, HList w) -> m' (a', HList w)) -> MultiReaderT w m a -> MultiReaderT w m' a' Source #

Map both the return value and the environment of a computation using the given function.

Note that there is a difference to mtl's ReaderT, where it is not possible to modify the environment.

mGetRaw :: Monad m => MultiReaderT a m (HList a) Source #

A raw extractor of the contained HList (i.e. the complete Reader).

mPutRaw :: Monad m => HList s -> MultiReaderT s m () Source #