simple-effects-0.8.0.2: A simple effect system that integrates with MTL

Safe HaskellNone
LanguageHaskell2010

Control.Effects

Synopsis

Documentation

type family EffectMsg eff :: * Source #

Instances

type EffectMsg (Early a) Source # 
type EffectMsg (Early a) = a
type EffectMsg (ReadEnv e) Source # 
type EffectMsg (ReadEnv e) = ()

type family EffectRes eff :: * Source #

Instances

type EffectRes (Early a) Source # 
type EffectRes (Early a) = Void
type EffectRes (ReadEnv e) Source # 
type EffectRes (ReadEnv e) = e

class Monad m => MonadEffect eff m where Source #

Minimal complete definition

effect

Methods

effect :: proxy eff -> EffectMsg eff -> m (EffectRes eff) Source #

Use the effect described by eff.

Instances

(MonadEffect eff m, MonadTrans t, Monad (t m)) => MonadEffect eff (t m) Source # 

Methods

effect :: proxy eff -> EffectMsg eff -> t m (EffectRes eff) Source #

Monad m => MonadEffect eff (EffectHandler eff m) Source # 

Methods

effect :: proxy eff -> EffectMsg eff -> EffectHandler eff m (EffectRes eff) Source #

(Monad m, (~) * a b) => MonadEffect (Early a) (ExceptT (Early b) m) Source # 

Methods

effect :: proxy (Early a) -> EffectMsg (Early a) -> ExceptT (Early b) m (EffectRes (Early a)) Source #

newtype EffectHandler eff m a Source #

The EffectHandler is really just a ReaderT carrying around the function that knows how to handle the effect.

Constructors

EffectHandler 

Fields

Instances

MonadBase b m => MonadBase b (EffectHandler eff m) Source # 

Methods

liftBase :: b α -> EffectHandler eff m α #

MonadBaseControl b m => MonadBaseControl b (EffectHandler eff m) Source # 

Associated Types

type StM (EffectHandler eff m :: * -> *) a :: * #

Methods

liftBaseWith :: (RunInBase (EffectHandler eff m) b -> b a) -> EffectHandler eff m a #

restoreM :: StM (EffectHandler eff m) a -> EffectHandler eff m a #

MonadReader s m => MonadReader s (EffectHandler eff m) Source # 

Methods

ask :: EffectHandler eff m s #

local :: (s -> s) -> EffectHandler eff m a -> EffectHandler eff m a #

reader :: (s -> a) -> EffectHandler eff m a #

MonadState s m => MonadState s (EffectHandler eff m) Source # 

Methods

get :: EffectHandler eff m s #

put :: s -> EffectHandler eff m () #

state :: (s -> (a, s)) -> EffectHandler eff m a #

Monad m => MonadEffect eff (EffectHandler eff m) Source # 

Methods

effect :: proxy eff -> EffectMsg eff -> EffectHandler eff m (EffectRes eff) Source #

MonadTrans (EffectHandler eff) Source # 

Methods

lift :: Monad m => m a -> EffectHandler eff m a #

RunnableTrans (EffectHandler eff) Source # 

Associated Types

type TransformerState (EffectHandler eff :: (* -> *) -> * -> *) (m :: * -> *) :: * Source #

type TransformerResult (EffectHandler eff :: (* -> *) -> * -> *) (m :: * -> *) a :: * Source #

Monad m => Monad (EffectHandler eff m) Source # 

Methods

(>>=) :: EffectHandler eff m a -> (a -> EffectHandler eff m b) -> EffectHandler eff m b #

(>>) :: EffectHandler eff m a -> EffectHandler eff m b -> EffectHandler eff m b #

return :: a -> EffectHandler eff m a #

fail :: String -> EffectHandler eff m a #

Functor m => Functor (EffectHandler eff m) Source # 

Methods

fmap :: (a -> b) -> EffectHandler eff m a -> EffectHandler eff m b #

(<$) :: a -> EffectHandler eff m b -> EffectHandler eff m a #

Applicative m => Applicative (EffectHandler eff m) Source # 

Methods

pure :: a -> EffectHandler eff m a #

(<*>) :: EffectHandler eff m (a -> b) -> EffectHandler eff m a -> EffectHandler eff m b #

(*>) :: EffectHandler eff m a -> EffectHandler eff m b -> EffectHandler eff m b #

(<*) :: EffectHandler eff m a -> EffectHandler eff m b -> EffectHandler eff m a #

MonadIO m => MonadIO (EffectHandler eff m) Source # 

Methods

liftIO :: IO a -> EffectHandler eff m a #

MonadRandom m => MonadRandom (EffectHandler eff m) Source # 

Methods

getRandomR :: Random a => (a, a) -> EffectHandler eff m a #

getRandom :: Random a => EffectHandler eff m a #

getRandomRs :: Random a => (a, a) -> EffectHandler eff m [a] #

getRandoms :: Random a => EffectHandler eff m [a] #

Alternative m => Alternative (EffectHandler eff m) Source # 

Methods

empty :: EffectHandler eff m a #

(<|>) :: EffectHandler eff m a -> EffectHandler eff m a -> EffectHandler eff m a #

some :: EffectHandler eff m a -> EffectHandler eff m [a] #

many :: EffectHandler eff m a -> EffectHandler eff m [a] #

MonadThrow m => MonadThrow (EffectHandler eff m) Source # 

Methods

throwM :: Exception e => e -> EffectHandler eff m a #

MonadCatch m => MonadCatch (EffectHandler eff m) Source # 

Methods

catch :: Exception e => EffectHandler eff m a -> (e -> EffectHandler eff m a) -> EffectHandler eff m a #

type TransformerState (EffectHandler eff) m Source # 
type TransformerState (EffectHandler eff) m = EffectMsg eff -> m (EffectRes eff)
type TransformerResult (EffectHandler eff) m a Source # 
type TransformerResult (EffectHandler eff) m a = a
type StM (EffectHandler eff m) a Source # 
type StM (EffectHandler eff m) a = StM (ReaderT * (EffectMsg eff -> m (EffectRes eff)) m) a

handleEffect :: (EffectMsg eff -> m (EffectRes eff)) -> EffectHandler eff m a -> m a Source #

Handle the effect described by eff.