extensible-effects-1.1.0: An Alternative to Monad Transformers

Safe HaskellNone

Control.Eff.State

Contents

Description

Strict state effect

Example: implementing Fresh

 runFresh' :: (Typeable i, Enum i, Num i) => Eff (Fresh i :> r) w -> i -> Eff r w
 runFresh' m s = fst <$> runState s (loop $ admin m)
  where
   loop (Val x) = return x
   loop (E u)   = case decomp u of
     Right (Fresh k) -> do
                       n <- getState
                       putState (n + 1)
                       loop (k n)
     Left u' -> send (\k -> unsafeReUnion $ k <$> u') >>= loop

Synopsis

Read-write State

data State s w Source

Strict state effect

Instances

getState :: Typeable e => Member (State e) r => Eff r eSource

Return the current value of the state.

putState :: Typeable e => Member (State e) r => e -> Eff r ()Source

Write a new value of the state.

onState :: (Typeable s, Member (State s) r) => (s -> s) -> Eff r ()Source

Transform the state with a function.

runStateSource

Arguments

:: Typeable s 
=> s

Initial state

-> Eff (State s :> r) w

Effect incorporating State

-> Eff r (s, w)

Effect containing final state and a return value

Run a State effect.

Reader

data Reader e v Source

The request for a value of type e from the current environment. This environment is analogous to a parameter of type e.

Instances

getReader :: (Typeable e, Member (Reader e) r) => Eff r eSource

Get the current value from a Reader.

runReader :: Typeable e => Eff (Reader e :> r) w -> e -> Eff r wSource

The handler of Reader requests. The return type shows that all Reader requests are fully handled.

local :: (Typeable e, Member (Reader e) r) => (e -> e) -> Eff r a -> Eff r aSource

Locally rebind the value in the dynamic environment. This function both requests and admins Reader requests.

Writer

data Writer e v Source

The request to remember a value of type e in the current environment

Instances

putWriter :: (Typeable e, Member (Writer e) r) => e -> Eff r ()Source

runWriter :: Typeable e => Eff (Writer e :> r) w -> Eff r (Maybe e, w)Source

Handle Writer requests by overwriting previous values. If no value of type e was returned, Nothing is returned; otherwise return Just the most recent value written.

runPusher :: Typeable e => Eff (Writer e :> r) w -> Eff r ([e], w)Source

Handle Writer requests by stacking written values on to a list.