data-accessor-0.2.1: Utilities for accessing and manipulating fields of recordsSource codeContentsIndex
Data.Accessor.Basic
Description
This module defines the Accessor type. It should be imported with qualification.
Synopsis
data T r a
fromSetGet :: (a -> r -> r) -> (r -> a) -> T r a
fromLens :: (r -> (a, a -> r)) -> T r a
fromWrapper :: (b -> a) -> (a -> b) -> T a b
self :: T r r
null :: T r ()
result :: Eq a => a -> T (a -> r) r
set :: T r a -> a -> r -> r
(^=) :: T r a -> a -> r -> r
compose :: [r -> r] -> r -> r
get :: T r a -> r -> a
(^.) :: r -> T r a -> a
modify :: T r a -> (a -> a) -> r -> r
(^:) :: T r a -> (a -> a) -> r -> r
(.>) :: T a b -> T b c -> T a c
(<.) :: T b c -> T a b -> T a c
($%) :: a -> (a -> b) -> b
Documentation
data T r a Source
The access functions we propose, look very similar to those needed for List.mapAccumL (but parameter order is swapped) and State monad. They get the new value of the field and the record and return the old value of the field and the record with the updated field.
show/hide Instances
fromSetGet :: (a -> r -> r) -> (r -> a) -> T r aSource
fromLens :: (r -> (a, a -> r)) -> T r aSource
fromWrapper :: (b -> a) -> (a -> b) -> T a bSource

If an object is wrapped in a newtype, you can generate an Accessor to the unwrapped data by providing a wrapper and an unwrapper function. The set function is simpler in this case, since no existing data must be kept. Since the information content of the wrapped and unwrapped data is equivalent, you can swap wrapper and unwrapper. This way you can construct an Accessor that treats a record field containing an unwrapped object like a field containing a wrapped object.

 newtype A = A {unA :: Int}

 access :: Accessor.T A Int
 access = fromWrapper A unA
self :: T r rSource
Access the record itself
null :: T r ()Source
Access a (non-existing) element of type ()
result :: Eq a => a -> T (a -> r) rSource

result a accesses the value of a function for argument a.

Also see semantic editor combinators, that allow to modify all function values of a function at once. Cf. http://conal.net/blog/posts/semantic-editor-combinators/

set :: T r a -> a -> r -> rSource
Set the value of a field.
(^=) :: T r a -> a -> r -> rSource
set as infix operator. This lets us write first ^= 2+3 $ second ^= 5+7 $ record.
compose :: [r -> r] -> r -> rSource
This is a general function, but it is especially useful for setting many values of different type at once.
get :: T r a -> r -> aSource
Get the value of a field.
(^.) :: r -> T r a -> aSource
get as infix operator. This lets us write record^.field^.subfield. This imitates Modula II syntax.
modify :: T r a -> (a -> a) -> r -> rSource
Transform the value of a field by a function.
(^:) :: 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).
(.>) :: T a b -> T b c -> T a cSource
Accessor composition: Combine an accessor with an accessor to a sub-field. Speak "stack".
(<.) :: T b c -> T a b -> T a cSource

Accessor composition the other direction.

 (<.) = flip (.>)
($%) :: a -> (a -> b) -> bSource
Flipped version of '($)'.
Produced by Haddock version 2.4.2