packages feed

proton-0.0.1: src/Proton/Lens.hs

module Proton.Lens where

import Data.Profunctor
import Data.Profunctor.Strong
import Control.Arrow ((&&&))

type Lens s t a b = forall p. Strong p => p a b -> p s t
type Lens' s a = Lens s s a a

lens :: (s -> a) -> (s -> b -> t) -> Lens s t a b
-- lens getter setter = strong setter . lmap getter
lens getter setter = dimap (id &&& getter) (uncurry setter) . second'

_1 :: Lens (a, x) (b, x) a b
_1 = lens fst (\(_, x) b -> (b, x))


_2 :: Lens (x, a) (x, b) a b
_2 = lens snd (\(x, _) b -> (x, b))