references-0.3.0.1: Selectors for reading and updating data.

Control.Reference.Combinators

Contents

Description

Operators to combine and transform references.

Synopsis

Binary operators on references

(&) :: (Monad w, Monad r) => Reference w r w' r' s t c d -> Reference w r w' r' c d a b -> Reference w r w' r' s t a b infixl 6 Source

Composes two references. They must be of the same kind.

If reference `r` accesses `b` inside the context `a`, and reference `p` accesses `c` inside the context `b`, than the reference `r&p` will access `c` inside `a`.

Composition is associative: ` (r&p)&q = r&(p&q) `

(&+&) :: (RefMonads w r, RefMonads w' r', MonadPlus r, MonadPlus r', Morph [] r) => Reference w r w' r' s s a a -> Reference w r w' r' s s a a -> Reference w r w' r' s s a a infixl 5 Source

Using this operator may result in accessing the same parts of data multiple times. For example ` twice = self &+& self ` is a reference that accesses itself twice:

```a ^? twice == [a,a]
(twice *= x) a == x
(twice .- f) a == f (f a)```

Addition is commutative only if we do not consider the order of the results from a get, or the order in which monadic actions are performed.

(&|&) :: RefMonads m m' => Reference m m m' m' s t a b -> Reference m m m' m' s' t' a' b' -> Reference m m m' m' (s, s') (t, t') (a, a') (b, b') infixl 5 Source

Pack two references in parallel.

turn :: Reference w r w' r' s t a b -> Reference w' r' w r a b s t Source

Flips a reference to the other direction. The monads of the references can change when a reference is turned.