ether-0.5.1.0: Monad transformers and classes

Safe HaskellNone
LanguageHaskell2010

Ether.TagDispatch

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 Ether
import Control.Monad.State as Mtl

data Foo
data Bar

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

g :: Ether.MonadState Foo Int m => m String
g = tagAttach @Foo f

h :: Ether.MonadState Bar Int m => m String
h = tagReplace @Foo @Bar g

Synopsis

The Tag Attach monad transformer

tagAttach :: forall tag m a. TagAttachT tag m a -> m a Source #

Attach a tag to untagged transformers.

The Tag Replace monad transformer

type TagReplaceT tOld tNew = TaggedTrans (TAG_REPLACE tOld tNew) IdentityT Source #

tagReplace :: forall tOld tNew m a. TagReplaceT tOld tNew m a -> m a Source #

Replace a tag with another tag.

Internal labels

data TAG_ATTACH t Source #

Encode type-level information for tagAttach.

Instances

(MonadExcept k tag e m, (~) ((* -> *) -> * -> *) trans (IdentityT *)) => MonadError e (TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m) Source # 

Methods

throwError :: e -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a #

catchError :: TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a -> (e -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a) -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a #

(MonadReader k tag r m, (~) ((* -> *) -> * -> *) trans (IdentityT *)) => MonadReader r (TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m) Source # 

Methods

ask :: TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m r #

local :: (r -> r) -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a #

reader :: (r -> a) -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a #

(MonadState k tag s m, (~) ((* -> *) -> * -> *) trans (IdentityT *)) => MonadState s (TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m) Source # 

Methods

get :: TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m s #

put :: s -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m () #

state :: (s -> (a, s)) -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a #

(MonadWriter k tag w m, (~) ((* -> *) -> * -> *) trans (IdentityT *)) => MonadWriter w (TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m) Source # 

Methods

writer :: (a, w) -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a #

tell :: w -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m () #

listen :: TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m (a, w) #

pass :: TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m (a, w -> w) -> TaggedTrans * (* -> *) * (TAG_ATTACH k tag) trans m a #

data TAG_REPLACE tOld tNew Source #

Encode type-level information for tagReplace.

Instances

(MonadReader k1 tNew r m, (~) ((* -> *) -> * -> *) trans (IdentityT *)) => MonadReader k tOld r (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) Source # 

Methods

ask :: m (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) Source #

local :: (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m -> TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) -> m a -> m a Source #

reader :: (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m -> a) -> m a Source #

(MonadState k1 tNew s m, (~) ((* -> *) -> * -> *) trans (IdentityT *)) => MonadState k tOld s (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) Source # 

Methods

get :: m (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) Source #

put :: TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m -> m () Source #

state :: (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m -> (a, TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m)) -> m a Source #

(MonadWriter k1 tNew w m, (~) ((* -> *) -> * -> *) trans (IdentityT *)) => MonadWriter k tOld w (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) Source # 

Methods

writer :: (a, TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) -> m a Source #

tell :: TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m -> m () Source #

listen :: m a -> m (a, TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) Source #

pass :: m (a, TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m -> TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) -> m a Source #

(MonadExcept k1 tNew e m, (~) ((* -> *) -> * -> *) trans (IdentityT *)) => MonadExcept k tOld e (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m) Source # 

Methods

throw :: TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m -> m a Source #

catch :: m a -> (TaggedTrans * (* -> *) * (TAG_REPLACE k1 k tOld tNew) trans m -> m a) -> m a Source #