cleff- Fast and concise extensible effects
Copyright(c) 2021 Xy Ren
Portabilitynon-portable (GHC only)
Safe HaskellTrustworthy





data State s :: Effect where Source #

An effect capable of providing a mutable state s that can be read and written. This roughly corresponds to the MonadState typeclass and StateT monad transformer in the mtl approach.


Get :: State s m s 
Put :: s -> State s m () 
State :: (s -> (a, s)) -> State s m a 


get :: State s :> es => Eff es s Source #

put :: State s :> es => s -> Eff es () Source #

state :: State s :> es => (s -> (a, s)) -> Eff es a Source #

gets :: State s :> es => (s -> t) -> Eff es t Source #

Apply a function to the result of get.

modify :: State s :> es => (s -> s) -> Eff es () Source #

Modify the value of the state via a function.


runState :: s -> Eff (State s ': es) a -> Eff es (a, s) Source #

Run the State effect.

Caveat: The runState interpreter is implemented with IORefs and there is no way to do arbitrary atomic transactions. The state operation is atomic though and it is implemented with atomicModifyIORefCAS, which can be faster than atomicModifyIORef in contention. For any more complicated cases of atomicity, please build your own effect that uses either MVars or TVars based on your need.

Unlike mtl, in cleff the state will not revert when an error is thrown.

runState will stop taking care of state operations done on forked threads as soon as the main thread finishes its computation. Any state operation done before main thread finishes is still taken into account.

zoom :: State t :> es => Lens' t s -> Eff (State s ': es) ~> Eff es Source #

Run a State effect in terms of a larger State via a Lens'.