{-# LANGUAGE RankNTypes #-}
module Strive.Lenses
( Lens
, get
, set
, update
) where
import Data.Functor.Constant (Constant(Constant), getConstant)
import Data.Functor.Identity (Identity(Identity), runIdentity)
type Lens a b = forall f . Functor f => (b -> f b) -> a -> f a
get :: Lens a b -> a -> b
get :: forall a b. Lens a b -> a -> b
get Lens a b
lens = forall {k} a (b :: k). Constant a b -> a
getConstant forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lens a b
lens forall {k} a (b :: k). a -> Constant a b
Constant
set :: Lens a b -> b -> a -> a
set :: forall a b. Lens a b -> b -> a -> a
set Lens a b
lens b
x = forall a b. Lens a b -> (b -> b) -> a -> a
update Lens a b
lens (forall a b. a -> b -> a
const b
x)
update :: Lens a b -> (b -> b) -> a -> a
update :: forall a b. Lens a b -> (b -> b) -> a -> a
update Lens a b
lens b -> b
f = forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lens a b
lens (forall a. a -> Identity a
Identity forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> b
f)