This module provides a simple abstract data type for a piece of a data stucture that can be read from and written to. It provides an automatic Template Haskell routine to scour data type definitions and generate accessor objects for them automatically.

- data Accessor s a = Accessor {}
- nameDeriveAccessors :: Name -> (String -> Maybe String) -> Q [Dec]
- deriveAccessors :: Name -> Q [Dec]
- getA :: MonadState s m => Accessor s a -> m a
- putA :: MonadState s m => Accessor s a -> a -> m ()
- modA :: MonadState s m => Accessor s a -> (a -> a) -> m ()
- (.>) :: Accessor a b -> Accessor b c -> Accessor a c
- (<.) :: Accessor b c -> Accessor a b -> Accessor a c
- (=:) :: MonadState s m => Accessor s a -> a -> m ()

# Documentation

An `Accessor s 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 s) = x setVal a (getVal a s) s = s

nameDeriveAccessors :: Name -> (String -> Maybe String) -> Q [Dec]Source

`nameDeriveAccessors n f`

where `n`

is the name of a data type
declared with `data`

and `f`

is a function from names of fields
in that data type to the name of the corresponding accessor. If
`f`

returns `Nothing`

, then no accessor is generated for that
field.

deriveAccessors :: Name -> Q [Dec]Source

`deriveAccessors n`

where `n`

is the name of a data type
declared with `data`

looks through all the declared fields
of the data type, and for each field ending in an underscore
generates an accessor of the same name without the underscore.

It is nameDeriveAccessors n f where `f`

satisfies

f (s ++ "_") = Just s f x = x -- otherwise

For example, given the data type:

data Score = Score { p1Score_ :: Int , p2Score_ :: Int , rounds :: Int }

`deriveAccessors`

will generate the following objects:

p1Score :: Accessor Score Int p1Score = Accessor p1Score_ (\x s -> s { p1Score_ = x }) p2Score :: Accessor Score Int p2Score = Accessor p2Score_ (\x s -> s { p2Score_ = x })

getA :: MonadState s m => Accessor s a -> m aSource

A structural dereference function for state monads.

putA :: MonadState s m => Accessor s a -> a -> m ()Source

A structural assignment function for state monads.

modA :: MonadState s m => Accessor s a -> (a -> a) -> m ()Source

A structural modification function for state monads.

(<.) :: Accessor b c -> Accessor a b -> Accessor a cSource

Accessor composition the other direction.

(<.) = flip (.>)

(=:) :: MonadState s m => Accessor s a -> a -> m ()Source

An assignment operator for state monads.

(=:) = putA