simple-effects-0.5.0.0: 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 EffectMsg (SetState s) Source # 
type EffectMsg (SetState s) = s
type EffectMsg (GetState s) Source # 
type EffectMsg (GetState s) = ()

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
type EffectRes (SetState s) Source # 
type EffectRes (SetState s) = ()
type EffectRes (GetState s) Source # 
type EffectRes (GetState s) = s

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 => MonadEffect (Early a) (ExceptT a m) Source # 

Methods

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

Monad m => MonadEffect (SetState s) (StateT s m) Source # 

Methods

effect :: proxy (SetState s) -> EffectMsg (SetState s) -> StateT s m (EffectRes (SetState s)) Source #

Monad m => MonadEffect (GetState s) (StateT s m) Source # 

Methods

effect :: proxy (GetState s) -> EffectMsg (GetState s) -> StateT s m (EffectRes (GetState s)) 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

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 #

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 #

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

Associated Types

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

Methods

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

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

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

Methods

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

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 #

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 #

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

Methods

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

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

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

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

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

Methods

liftIO :: IO 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 StM (EffectHandler eff m) a Source # 
type StM (EffectHandler eff m) a = StM (ReaderT * (EffectMsg eff -> m (EffectRes eff)) m) a

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

Handle the effect described by eff.