Safe Haskell | None |
---|---|

Language | Haskell2010 |

Strict state effect

- data State s v where
- get :: Member (State s) r => Eff r s
- put :: Member (State s) r => s -> Eff r ()
- runState' :: Eff (State s ': r) w -> s -> Eff r (w, s)
- runState :: Eff (State s ': r) w -> s -> Eff r (w, s)
- modify :: Member (State s) r => (s -> s) -> Eff r ()
- evalState :: Eff (State s ': r) w -> s -> Eff r w
- execState :: Eff (State s ': r) w -> s -> Eff r s
- data ProxyState s = ProxyState
- transactionState :: forall s r w. Member (State s) r => ProxyState s -> Eff r w -> Eff r w
- runStateR :: Eff (Writer s ': (Reader s ': r)) w -> s -> Eff r (w, s)

# Documentation

State, strict

Initial design: The state request carries with it the state mutator function We can use this request both for mutating and getting the state. But see below for a better design!

data State s v where State :: (s->s) -> State s s

In this old design, we have assumed that the dominant operation is modify. Perhaps this is not wise. Often, the reader is most nominant.

See also below, for decomposing the State into Reader and Writer!

The conventional design of State

get :: Member (State s) r => Eff r s Source #

Return the current value of the state. The signatures are inferred

:: Eff (State s ': r) w | Effect incorporating State |

-> s | Initial state |

-> Eff r (w, s) | Effect containing final state and a return value |

Run a State effect

evalState :: Eff (State s ': r) w -> s -> Eff r w Source #

Run a State effect, discarding the final state.

execState :: Eff (State s ': r) w -> s -> Eff r s Source #

Run a State effect and return the final state.

data ProxyState s Source #

An encapsulated State handler, for transactional semantics The global state is updated only if the transactionState finished successfully

transactionState :: forall s r w. Member (State s) r => ProxyState s -> Eff r w -> Eff r w Source #