This module provides a simple abstract data type for a piece of a data stucture that can be read from and written to. In contrast to Data.Accessor.Basic it is intended for unqualified import.

- type Accessor r a = T r a
- accessor :: (r -> a) -> (a -> r -> r) -> Accessor r a
- setVal :: Accessor r a -> a -> r -> r
- (^=) :: T r a -> a -> r -> r
- getVal :: Accessor r a -> r -> a
- (^.) :: r -> T r a -> a
- (^:) :: T r a -> (a -> a) -> r -> r
- getA :: Monad m => Accessor r a -> StateT r m a
- putA :: Monad m => Accessor r a -> a -> StateT r m ()
- (=:) :: Monad m => Accessor r a -> a -> StateT r m ()
- (%=) :: Monad m => T r a -> a -> StateT r m ()
- modA :: Monad m => Accessor r a -> (a -> a) -> StateT r m ()
- (%:) :: Monad m => T r a -> (a -> a) -> StateT r m ()
- (.>) :: Accessor a b -> Accessor b c -> Accessor a c
- (<.) :: Accessor b c -> Accessor a b -> Accessor a c

# Documentation

type Accessor r a = T r aSource

An `Accessor r a`

is an object that encodes how to
get and put a subject of type `a`

out of/into an object
of type `s`

.

In order for an instance of this data structure `a`

to be
an `Accessor`

, it must obey the following laws:

getVal a (setVal a x r) = x setVal a (getVal a r) r = r

:: (r -> a) | get method |

-> (a -> r -> r) | set method |

-> Accessor r a |

Construct an `Accessor`

from a `get`

and a `set`

method.

:: Accessor r a | record field |

-> a | value |

-> r | original record |

-> r | new record with field |

Set a value of a record field that is specified by an Accessor

(^=) :: T r a -> a -> r -> rSource

`set`

as infix operator.
This lets us write `first ^= 2+3 $ second ^= 5+7 $ record`

.

:: Accessor r a | record field |

-> r | record |

-> a | value of the field in the record |

Get a value from a record field that is specified by an Accessor

`get`

as infix operator.
This lets us write `record^.field^.subfield`

.
This imitates Modula II syntax.

(^:) :: T r a -> (a -> a) -> r -> rSource

`modify`

as infix operator.
This lets us write
`field^:subfield^:(2*) $ record`

,
`record$%field^:subfield^:(2*)`

or `record$%field^:subfield^:(const 1)`

.

getA :: Monad m => Accessor r a -> StateT r m aSource

A structural dereference function for state monads.

putA :: Monad m => Accessor r a -> a -> StateT r m ()Source

A structural assignment function for state monads.

(=:) :: Monad m => Accessor r a -> a -> StateT r m ()Source

An "assignment operator" for state monads.

(=:) = putA

modA :: Monad m => Accessor r a -> (a -> a) -> StateT r m ()Source

A structural modification function for state monads.