ether-0.4.1.0: Monad transformers and classes

Safe HaskellNone
LanguageHaskell2010

Control.Monad.Trans.Ether.Dispatch

Contents

Description

Type-level machinery to manipulate constraints on the monad transformer stack.

Out of the box it provides the following dispatch strategies:

  • tagAttach to use functions defined using untagged monad classes as if they were defined using tagged ones.
  • tagReplace to use functions defined using one tag as if they were defined using another one.
import qualified Control.Monad.State as T
import Control.Ether.TH (ethereal)
import Control.Monad.Ether.State (MonadState)
import Control.Monad.Trans.Ether.Dispatch (tagAttach, tagDispatch)

ethereal "Foo" "foo"
ethereal "Bar" "bar"

f :: T.MonadState Int m => m String
f = fmap show T.get

g :: MonadState Foo Int m => m String
g = tagAttach foo f

h :: MonadState Bar Int m => m String
h = tagReplace foo bar g

Synopsis

The DispatchT monad transformer

newtype DispatchT dp m a Source #

Wrap a monad to change its tags. Under the hood this is simply IdentityT, all the work is happening on the type level.

Constructors

DispatchT (IdentityT m a) 

Instances

MonadBase b m => MonadBase b (DispatchT * k dp m) Source # 

Methods

liftBase :: b α -> DispatchT * k dp m α #

MonadBaseControl b m => MonadBaseControl b (DispatchT * k dp m) Source # 

Associated Types

type StM (DispatchT * k dp m :: * -> *) a :: * #

Methods

liftBaseWith :: (RunInBase (DispatchT * k dp m) b -> b a) -> DispatchT * k dp m a #

restoreM :: StM (DispatchT * k dp m) a -> DispatchT * k dp m a #

MFunctor (DispatchT * k dp) Source # 

Methods

hoist :: Monad m => (forall a. m a -> n a) -> DispatchT * k dp m b -> DispatchT * k dp n b #

MMonad (DispatchT * k dp) Source # 

Methods

embed :: Monad n => (forall a. m a -> DispatchT * k dp n a) -> DispatchT * k dp m b -> DispatchT * k dp n b #

MonadTrans (DispatchT * k dp) Source # 

Methods

lift :: Monad m => m a -> DispatchT * k dp m a #

MonadTransControl (DispatchT * k dp) Source # 

Associated Types

type StT (DispatchT * k dp :: (* -> *) -> * -> *) a :: * #

Methods

liftWith :: Monad m => (Run (DispatchT * k dp) -> m a) -> DispatchT * k dp m a #

restoreT :: Monad m => m (StT (DispatchT * k dp) a) -> DispatchT * k dp m a #

LiftCallCC (DispatchT * k dp) Source # 

Methods

liftCallCC :: Monad m => CallCC m (StT (DispatchT * k dp) a) (StT (DispatchT * k dp) b) -> CallCC (DispatchT * k dp m) a b #

liftCallCC' :: Monad m => CallCC m (StT (DispatchT * k dp) a) (StT (DispatchT * k dp) b) -> CallCC (DispatchT * k dp m) a b #

LiftCatch (DispatchT * k dp) Source # 

Methods

liftCatch :: Monad m => Catch * e m (StT (DispatchT * k dp) a) -> Catch * e (DispatchT * k dp m) a #

LiftListen (DispatchT * k dp) Source # 

Methods

liftListen :: Monad m => Listen w m (StT (DispatchT * k dp) a) -> Listen w (DispatchT * k dp m) a #

LiftLocal (DispatchT * k dp) Source # 

Methods

liftLocal :: Monad m => m r -> (forall a. Local r m a) -> forall a. Local r (DispatchT * k dp m) a #

LiftPass (DispatchT * k dp) Source # 

Methods

liftPass :: Monad m => Pass w m (StT (DispatchT * k dp) a) -> Pass w (DispatchT * k dp m) a #

Monad m => Monad (DispatchT * k dp m) Source # 

Methods

(>>=) :: DispatchT * k dp m a -> (a -> DispatchT * k dp m b) -> DispatchT * k dp m b #

(>>) :: DispatchT * k dp m a -> DispatchT * k dp m b -> DispatchT * k dp m b #

return :: a -> DispatchT * k dp m a #

fail :: String -> DispatchT * k dp m a #

Functor m => Functor (DispatchT * k dp m) Source # 

Methods

fmap :: (a -> b) -> DispatchT * k dp m a -> DispatchT * k dp m b #

(<$) :: a -> DispatchT * k dp m b -> DispatchT * k dp m a #

MonadFix m => MonadFix (DispatchT * k dp m) Source # 

Methods

mfix :: (a -> DispatchT * k dp m a) -> DispatchT * k dp m a #

Applicative m => Applicative (DispatchT * k dp m) Source # 

Methods

pure :: a -> DispatchT * k dp m a #

(<*>) :: DispatchT * k dp m (a -> b) -> DispatchT * k dp m a -> DispatchT * k dp m b #

(*>) :: DispatchT * k dp m a -> DispatchT * k dp m b -> DispatchT * k dp m b #

(<*) :: DispatchT * k dp m a -> DispatchT * k dp m b -> DispatchT * k dp m a #

MonadIO m => MonadIO (DispatchT * k dp m) Source # 

Methods

liftIO :: IO a -> DispatchT * k dp m a #

Alternative m => Alternative (DispatchT * k dp m) Source # 

Methods

empty :: DispatchT * k dp m a #

(<|>) :: DispatchT * k dp m a -> DispatchT * k dp m a -> DispatchT * k dp m a #

some :: DispatchT * k dp m a -> DispatchT * k dp m [a] #

many :: DispatchT * k dp m a -> DispatchT * k dp m [a] #

MonadPlus m => MonadPlus (DispatchT * k dp m) Source # 

Methods

mzero :: DispatchT * k dp m a #

mplus :: DispatchT * k dp m a -> DispatchT * k dp m a -> DispatchT * k dp m a #

MonadThrow m => MonadThrow (DispatchT * k dp m) Source # 

Methods

throwM :: Exception e => e -> DispatchT * k dp m a #

MonadCatch m => MonadCatch (DispatchT * k dp m) Source # 

Methods

catch :: Exception e => DispatchT * k dp m a -> (e -> DispatchT * k dp m a) -> DispatchT * k dp m a #

MonadMask m => MonadMask (DispatchT * k dp m) Source # 

Methods

mask :: ((forall a. DispatchT * k dp m a -> DispatchT * k dp m a) -> DispatchT * k dp m b) -> DispatchT * k dp m b #

uninterruptibleMask :: ((forall a. DispatchT * k dp m a -> DispatchT * k dp m a) -> DispatchT * k dp m b) -> DispatchT * k dp m b #

Generic (DispatchT k1 k dp m a) Source # 

Associated Types

type Rep (DispatchT k1 k dp m a) :: * -> * #

Methods

from :: DispatchT k1 k dp m a -> Rep (DispatchT k1 k dp m a) x #

to :: Rep (DispatchT k1 k dp m a) x -> DispatchT k1 k dp m a #

type StT (DispatchT * k dp) a Source # 
type StT (DispatchT * k dp) a = StT (IdentityT *) a
type StT (DispatchT * k dp) a Source # 
type StT (DispatchT * k dp) a = StT (DispatchT * k dp) a
type StM (DispatchT * k dp m) a Source # 
type StM (DispatchT * k dp m) a = ComposeSt (DispatchT * k dp) m a
type Rep (DispatchT k1 k dp m a) Source # 
type Rep (DispatchT k1 k dp m a) = D1 (MetaData "DispatchT" "Control.Monad.Trans.Ether.Dispatch" "ether-0.4.1.0-Ct4ST2coiPMBtQpHrUtzac" True) (C1 (MetaCons "DispatchT" PrefixI False) (S1 (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (IdentityT k1 m a))))

Dispatch types and functions

data K_TagAttach t Source #

Encode type-level information for tagAttach.

Constructors

TagAttach t 

data K_TagReplace tOld tNew Source #

Encode type-level information for tagReplace.

Constructors

TagReplace tOld tNew 

tagAttach :: proxy t -> DispatchTagAttachT t m a -> m a Source #

Attach a tag to untagged transformers.

tagReplace :: proxy tOld -> proxy tNew -> DispatchTagReplaceT tOld tNew m a -> m a Source #

Replace a tag with another tag.