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

Language | Haskell2010 |

## Synopsis

- data State s m a where
- get :: forall s r. MemberWithError (State s) r => Sem r s
- gets :: forall s a r. Member (State s) r => (s -> a) -> Sem r a
- put :: forall s r. MemberWithError (State s) r => s -> Sem r ()
- modify :: Member (State s) r => (s -> s) -> Sem r ()
- modify' :: Member (State s) r => (s -> s) -> Sem r ()
- runState :: s -> Sem (State s ': r) a -> Sem r (s, a)
- evalState :: s -> Sem (State s ': r) a -> Sem r a
- execState :: s -> Sem (State s ': r) a -> Sem r s
- runLazyState :: s -> Sem (State s ': r) a -> Sem r (s, a)
- evalLazyState :: s -> Sem (State s ': r) a -> Sem r a
- execLazyState :: s -> Sem (State s ': r) a -> Sem r s
- runStateIORef :: forall s r a. Member (Embed IO) r => IORef s -> Sem (State s ': r) a -> Sem r a
- stateToIO :: forall s r a. Member (Embed IO) r => s -> Sem (State s ': r) a -> Sem r (s, a)
- runStateSTRef :: forall s st r a. Member (Embed (ST st)) r => STRef st s -> Sem (State s ': r) a -> Sem r a
- stateToST :: forall s st r a. Member (Embed (ST st)) r => s -> Sem (State s ': r) a -> Sem r (s, a)
- hoistStateIntoStateT :: Sem (State s ': r) a -> StateT s (Sem r) a

# Effect

data State s m a where Source #

An effect for providing statefulness. Note that unlike mtl's
`StateT`

, there is no restriction that the `State`

effect corresponds necessarily to *local* state. It could could just as well
be interrpeted in terms of HTTP requests or database access.

Interpreters which require statefulness can `reinterpret`

themselves in terms of `State`

, and subsequently call `runState`

.

## Instances

type DefiningModule (State :: Type -> k -> Type -> Type) Source # | |

Defined in Polysemy.State |

# Actions

modify' :: Member (State s) r => (s -> s) -> Sem r () Source #

A variant of `modify`

in which the computation is strict in the
new state.

# Interpretations

evalState :: s -> Sem (State s ': r) a -> Sem r a Source #

Run a `State`

effect with local state.

*Since: 1.0.0.0*

execState :: s -> Sem (State s ': r) a -> Sem r s Source #

Run a `State`

effect with local state.

*Since: 1.2.3.1*

runLazyState :: s -> Sem (State s ': r) a -> Sem r (s, a) Source #

Run a `State`

effect with local state, lazily.

evalLazyState :: s -> Sem (State s ': r) a -> Sem r a Source #

Run a `State`

effect with local state, lazily.

*Since: 1.0.0.0*

execLazyState :: s -> Sem (State s ': r) a -> Sem r s Source #

Run a `State`

effect with local state, lazily.

*Since: 1.2.3.1*

runStateIORef :: forall s r a. Member (Embed IO) r => IORef s -> Sem (State s ': r) a -> Sem r a Source #

Run a `State`

effect by transforming it into operations over an `IORef`

.

*Note*: This is not safe in a concurrent setting, as `modify`

isn't atomic.
If you need operations over the state to be atomic,
use `runAtomicStateIORef`

or
`runAtomicStateTVar`

instead.

*Since: 1.0.0.0*

stateToIO :: forall s r a. Member (Embed IO) r => s -> Sem (State s ': r) a -> Sem r (s, a) Source #

Run an `State`

effect in terms of operations
in `IO`

.

Internally, this simply creates a new `IORef`

, passes it to
`runStateIORef`

, and then returns the result and the final value
of the `IORef`

.

*Note*: This is not safe in a concurrent setting, as `modify`

isn't atomic.
If you need operations over the state to be atomic,
use `atomicStateToIO`

instead.

*Beware*: As this uses an `IORef`

internally,
all other effects will have local
state semantics in regards to `State`

effects
interpreted this way.
For example, `throw`

and `catch`

will
never revert `put`

s, even if `runError`

is used
after `stateToIO`

.

*Since: 1.2.0.0*

runStateSTRef :: forall s st r a. Member (Embed (ST st)) r => STRef st s -> Sem (State s ': r) a -> Sem r a Source #

stateToST :: forall s st r a. Member (Embed (ST st)) r => s -> Sem (State s ': r) a -> Sem r (s, a) Source #

Run an `State`

effect in terms of operations
in `ST`

.

Internally, this simply creates a new `STRef`

, passes it to
`runStateSTRef`

, and then returns the result and the final value
of the `STRef`

.

*Beware*: As this uses an `STRef`

internally,
all other effects will have local
state semantics in regards to `State`

effects
interpreted this way.
For example, `throw`

and `catch`

will
never revert `put`

s, even if `runError`

is used
after `stateToST`

.

When not using the plugin, one must introduce the existential `st`

type to
`stateToST`

, so that the resulting type after `runM`

can be resolved into
`forall st. ST st (s, a)`

for use with `runST`

. Doing so requires
`-XScopedTypeVariables`

.

stResult :: forall s a. (s, a) stResult = runST ( (runM $ stateToST @_ @st undefined $ pure undefined) :: forall st. ST st (s, a) )

*Since: 1.3.0.0*