atrans-0.1.1.0: A small collection of monad (transformer) instances.

Copyright(c) Philipp Pfeiffer 2016
LicenseMIT
Maintainerpfiff@hax-f.net
Stabilityexperimental
PortabilityPOSIX
Safe HaskellSafe
LanguageHaskell2010

Control.Monad.Backend

Description

Defines the BackendT transformer, which is a variant of the StateT transformer, such that the state is within an MVar.

Synopsis

Documentation

newtype BackendT s m a Source #

The BackendT transformer is a StateT, where the state is encapsulated into a MVar. We have

BackendT s m a

where s is the state and m is a monad, usually with a MonadIO constraint. The state is only unwrapped, when get, set or state is used. A bind will not unwrap.

Constructors

BackendT (MVar s -> m (MVar s, a)) 

Instances

(Monad m, MonadIO m) => MonadState s (BackendT s m) Source # 

Methods

get :: BackendT s m s #

put :: s -> BackendT s m () #

state :: (s -> (a, s)) -> BackendT s m a #

Monad m => Monad (BackendT s m) Source # 

Methods

(>>=) :: BackendT s m a -> (a -> BackendT s m b) -> BackendT s m b #

(>>) :: BackendT s m a -> BackendT s m b -> BackendT s m b #

return :: a -> BackendT s m a #

fail :: String -> BackendT s m a #

Functor m => Functor (BackendT s m) Source # 

Methods

fmap :: (a -> b) -> BackendT s m a -> BackendT s m b #

(<$) :: a -> BackendT s m b -> BackendT s m a #

Monad m => Applicative (BackendT s m) Source # 

Methods

pure :: a -> BackendT s m a #

(<*>) :: BackendT s m (a -> b) -> BackendT s m a -> BackendT s m b #

(*>) :: BackendT s m a -> BackendT s m b -> BackendT s m b #

(<*) :: BackendT s m a -> BackendT s m b -> BackendT s m a #

(Monad m, MonadIO m) => MonadIO (BackendT s m) Source # 

Methods

liftIO :: IO a -> BackendT s m a #

runBackendT :: (Monad m, MonadIO m) => BackendT s m a -> s -> m (MVar s, a) Source #

runBackendT unwraps the BackendT monad on a given initial state. This given state is wrapped into an MVar.

rawRunBackendT :: BackendT s m a -> MVar s -> m (MVar s, a) Source #

rawRunBackendT unwraps then BackendT monad on a given initial state, where this state is wrapped into an MVar. **The MVar shouldn't be empty, otherwise every state reading/writing is blocking.** Usually, one should use runBackendT.