|
|
- {-# LANGUAGE RankNTypes #-}
- module Ahc.Data.Lens where
-
- import Control.Applicative
-
- import Data.Functor.Identity
-
- type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
-
- type Lens' s a = Lens s s a a
-
- get :: Lens s t a b -> s -> a
- get l = getConst . l Const
-
- over :: Lens s t a b -> (a -> b) -> s -> t
- over l m = runIdentity . l (Identity . m)
-
- set :: Lens s t a b -> b -> s -> t
- set l b a = over l (const b) a
-
- (.~) :: Lens s t a b -> b -> s -> t
- (.~) = set
- infixr 4 .~
-
- (%~) :: Lens s t a b -> (a -> b) -> s -> t
- (%~) = over
- infixr 4 %~
-
- (^.) :: s -> Lens s t a b -> a
- x ^. l = get l x
-
- (&) :: t1 -> (t1 -> t2) -> t2
- x & f = f x
- infixr 0 &
-
- lens :: (s -> a) -> (s -> b -> t) -> Lens s t a b
- lens sa sbt afb s = sbt s <$> afb (sa s)
|