../
Accessor
########
Very naive lens-like library.
Download
========
accessor-hs-0.1.0.tar.gz
Usage
=====
To get started:
import Data.Accessor
An accessor is a getter with a setter.
For record fields, the accessors are defined as follows:
data Point = Point {_x :: Int, _y :: Int}
x = accessor _x (\elem record -> record {_x = elem})
y = accessor _y (\elem record -> record {_y = elem})
With an accessor, you can view, set, and transform data of the record:
point = Point 1 2
view x point -- 1
set x 3 point -- Point 3 2
over x (+1) point -- Point 2 2
For a nested record, accessors can be composed using `.`:
data Line = Line {_start :: Point, _end :: Point}
start = accessor _start (\elem record -> record {_start = elem})
end = accessor _end (\elem record -> record {_end = elem})
data Point = Point {_x :: Int, _y :: Int}
x = accessor _x (\elem record -> record {_x = elem})
y = accessor _y (\elem record -> record {_y = elem})
line = Line (Point 1 2) (Point 3 4)
start_x = view (start . x) line -- 1
end_y = view (end . y) line -- 4
If the field is a functor, the accessor should be composed with the
next accessor using `facc`. For example:
data Address = Address {_detail :: String, _code :: String }
detail = accessor _detail (\elem record -> record {_detail = elem})
code = accessor _code (\elem record -> record {_code = elem})
data Person = Person {_name :: String, _addr :: Maybe Address }
name = accessor _name (\elem record -> record {_name = elem})
addr= accessor _addr (\elem record -> record {_addr = elem})
Let there be Alice living in Shanghai:
alice = Person
{ _name = "Alice"
, _addr = Just Address
{ _detail = "Shanghai"
, _code = "200000"
}
}
You can view/modify Alice's address detail:
s = view (addr . facc . detail) alice -- Just "Shanghai"
The use of `fmap` inside of `facc` ensures that `Nothing` is handled
properly.
Accessor of the nth element of a list is `listAcc n`, and for 0 to 9,
there are shortcuts: `_0` to `_9`.
view _1 [1,2,3] -- 2
view (_1 . _1) [[1,2,3], [4,5,6] ] -- 5
set _0 42 [1,2,3] -- [42,2,3]
over _1 (+1) [1,2,3] -- [1,3,3]
Lists are also functors, so you can `fmap` over it using `facc`, which
is the same as `map`:
over facc (+1) [1,2,3] -- [2,3,4]
over (_1 . facc) (+1) [[1,2], [3,4] ] -- [ [1,2],[4,5] ]
-----
Email: i (at) mistivia (dot) com