polysemy-0.1.0.0: Higher-order, low-boilerplate, zero-cost free monads.

Safe HaskellNone
LanguageHaskell2010

Polysemy.Internal.Combinators

Contents

Synopsis

First order

interpret Source #

Arguments

:: FirstOrder e "interpret" 
=> (forall x m. e m x -> Semantic r x)

A natural transformation from the handled effect to other effects already in Semantic.

-> Semantic (e ': r) a 
-> Semantic r a 

The simplest way to produce an effect handler. Interprets an effect e by transforming it into other effects inside of r.

intercept Source #

Arguments

:: (Member e r, FirstOrder e "intercept") 
=> (forall x m. e m x -> Semantic r x)

A natural transformation from the handled effect to other effects already in Semantic.

-> Semantic r a

Unlike interpret, intercept does not consume any effects.

-> Semantic r a 

Like interpret, but instead of handling the effect, allows responding to the effect while leaving it unhandled. This allows you, for example, to intercept other effects and insert logic around them.

reinterpret Source #

Arguments

:: FirstOrder e1 "reinterpret" 
=> (forall m x. e1 m x -> Semantic (e2 ': r) x)

A natural transformation from the handled effect to the new effect.

-> Semantic (e1 ': r) a 
-> Semantic (e2 ': r) a 

Like interpret, but instead of removing the effect e, reencodes it in some new effect f. This function will fuse when followed by runState, meaning it's free to reinterpret in terms of the State effect and immediately run it.

reinterpret2 Source #

Arguments

:: FirstOrder e1 "reinterpret2" 
=> (forall m x. e1 m x -> Semantic (e2 ': (e3 ': r)) x)

A natural transformation from the handled effect to the new effects.

-> Semantic (e1 ': r) a 
-> Semantic (e2 ': (e3 ': r)) a 

Like reinterpret, but introduces two intermediary effects.

reinterpret3 Source #

Arguments

:: FirstOrder e1 "reinterpret2" 
=> (forall m x. e1 m x -> Semantic (e2 ': (e3 ': (e4 ': r))) x)

A natural transformation from the handled effect to the new effects.

-> Semantic (e1 ': r) a 
-> Semantic (e2 ': (e3 ': (e4 ': r))) a 

Like reinterpret, but introduces three intermediary effects.

Higher order

interpretH Source #

Arguments

:: (forall x m. e m x -> Tactical e m r x)

A natural transformation from the handled effect to other effects already in Semantic.

-> Semantic (e ': r) a 
-> Semantic r a 

Like interpret, but for higher-order effects (ie. those which make use of the m parameter.)

See the notes on Tactical for how to use this function.

interceptH Source #

Arguments

:: Member e r 
=> (forall x m. e m x -> Tactical e m r x)

A natural transformation from the handled effect to other effects already in Semantic.

-> Semantic r a

Unlike interpretH, interceptH does not consume any effects.

-> Semantic r a 

Like interceptH, but for higher-order effects.

See the notes on Tactical for how to use this function.

reinterpretH Source #

Arguments

:: (forall m x. e1 m x -> Tactical e1 m (e2 ': r) x)

A natural transformation from the handled effect to the new effect.

-> Semantic (e1 ': r) a 
-> Semantic (e2 ': r) a 

Like reinterpret, but for higher-order effects.

See the notes on Tactical for how to use this function.

reinterpret2H Source #

Arguments

:: (forall m x. e1 m x -> Tactical e1 m (e2 ': (e3 ': r)) x)

A natural transformation from the handled effect to the new effects.

-> Semantic (e1 ': r) a 
-> Semantic (e2 ': (e3 ': r)) a 

Like reinterpret2, but for higher-order effects.

See the notes on Tactical for how to use this function.

reinterpret3H Source #

Arguments

:: (forall m x. e1 m x -> Tactical e1 m (e2 ': (e3 ': (e4 ': r))) x)

A natural transformation from the handled effect to the new effects.

-> Semantic (e1 ': r) a 
-> Semantic (e2 ': (e3 ': (e4 ': r))) a 

Like reinterpret3, but for higher-order effects.

See the notes on Tactical for how to use this function.

Statefulness

stateful :: Typeable s => (forall x m. e m x -> s -> Semantic r (s, x)) -> s -> Semantic (e ': r) a -> Semantic r (s, a) Source #

Like interpret, but with access to an intermediate state s.

lazilyStateful :: Typeable s => (forall x m. e m x -> s -> Semantic r (s, x)) -> s -> Semantic (e ': r) a -> Semantic r (s, a) Source #

Like interpret, but with access to an intermediate state s.