stateref-0.3: Abstraction for things that work like IORef.

Safe HaskellNone

Data.StateRef

Description

This module provides classes and instances for mutable state references. Various implementation exist in common usage, but no way (until now ;-) to define functions using state references which don't depend on the specific monad or reference type in use.

These modules use several language extensions, including multi-parameter type classes and functional dependencies.

Synopsis

Documentation

readRef :: Ref m a -> m a

Read a Ref. See readReference.

writeRef :: Ref m a -> a -> m ()

Write a Ref. See writeReference

atomicModifyRef :: Ref m a -> (a -> (a, b)) -> m b

Modify a Ref. See modifyReference.

modifyRef :: Ref m a -> (a -> a) -> m ()

Modify a Ref. See modifyReference.

readsRef :: (ReadRef sr m a, Monad m) => sr -> (a -> b) -> m b

Essentially the same concept as gets, asks, et al. Typically useful to read a field of a referenced ADT by passing a record selector as the second argument.

newCounter :: (HasRef m, Monad m, Enum a) => a -> m (m a)

Construct a counter - a monadic value which, each time it is evaluated, returns the succ of the previous value returned.

mkLapseReader :: (ReadRef sr m a, HasRef m, Monad m) => sr -> (a -> a -> b) -> m (m b)

Create a "lapse reader" (suggestions for better terminology are more than welcome), a sort of a time-lapse of the variable. The first motivating instance for this operation was a clock in a simple simulation application. Given a TVar Double called "clock", a useful value "dT" is yielded by the expression: mkLapseReader clock (-)