fclabels-2.0: src/Data/Label/Total.hs
{-| Default lenses for simple total getters and monomorphic updates. Useful for
creating accessor labels for single constructor datatypes. Also useful field
labels that are shared between all the constructors of a multi constructor
datatypes.
-}
{-# LANGUAGE TypeOperators #-}
module Data.Label.Total
( (:->)
, Total
, lens
, get
, modify
, set
)
where
import Data.Label.Poly (Lens)
import Data.Label.Point (Total)
import qualified Data.Label.Poly as Poly
{-# INLINE lens #-}
{-# INLINE get #-}
{-# INLINE modify #-}
{-# INLINE set #-}
-------------------------------------------------------------------------------
-- | Total lens type specialized for total accessor functions.
type f :-> o = Lens Total f o
-- | Create a total lens from a getter and a modifier.
--
-- We expect the following law to hold:
--
-- > get l (set l a f) == a
--
-- > set l (get l f) f == f
lens :: (f -> o) -- ^ Getter.
-> ((o -> i) -> f -> g) -- ^ Modifier.
-> (f -> g) :-> (o -> i)
lens g s = Poly.lens g (uncurry s)
-- | Get the getter function from a lens.
get :: ((f -> g) :-> (o -> i)) -> f -> o
get = Poly.get
-- | Get the modifier function from a lens.
modify :: (f -> g) :-> (o -> i) -> (o -> i) -> f -> g
modify = curry . Poly.modify
-- | Get the setter function from a lens.
set :: ((f -> g) :-> (o -> i)) -> i -> f -> g
set = curry . Poly.set