record-0.1.1: library/Record/Lens.hs
-- |
-- A minimal subset of the "lens" library functionality,
-- which is completely compatible with it.
--
-- Unless you use the "lens" library itself,
-- this module is your interface to manipulating the record fields.
module Record.Lens where
import BasePrelude
import Data.Functor.Identity
-- |
-- A reference from a datastructure @s@ to some part @a@,
-- which can be used to manipulate that particular part.
type Lens s a =
forall f. Functor f => (a -> f a) -> (s -> f s)
-- |
-- Given a lens to a subpart and a datastructure,
-- produce the value of the referred subpart.
view :: Lens s a -> s -> a
view l =
getConst . l Const
-- |
-- Given a lens to a subpart, a new value for it and a datastructure,
-- produce an updated datastructure.
set :: Lens s a -> a -> s -> s
set l a =
runIdentity . l (Identity . const a)
-- |
-- Given a lens to a subpart, and an update function for it,
-- produce a function, which updates the datastructure.
over :: Lens s a -> (a -> a) -> s -> s
over l f =
runIdentity . l (Identity . f)