module Generics.Pointless.Lenses where
import Generics.Pointless.Functors
data Lens c a = Lens { get :: c -> a
, put :: (a,c) -> c
, create :: a -> c
}
type NatLens f g = forall x. x -> Lens (Rep f x) (Rep g x)
inc_lns :: Enum a => Lens a a
inc_lns = Lens succ (pred . fst) pred
dec_lns :: Enum a => Lens a a
dec_lns = Lens pred (succ . fst) succ
lnsEq :: (Eq a,Eq c) => Lens c a -> Lens c a -> a -> c -> Bool
lnsEq l l' a c = getEq l l' c && putEq l l' a c && createEq l l' a
getEq :: Eq a => Lens c a -> Lens c a -> c -> Bool
getEq l l' c = get l c == get l' c
putEq :: (Eq a,Eq c) => Lens c a -> Lens c a -> a -> c -> Bool
putEq l l' a c = put l (a,c) == put l' (a,c)
createEq :: Eq c => Lens c a -> Lens c a -> a -> Bool
createEq l l' a = create l a == create l' a
wb :: (Eq a,Eq c) => Lens c a -> a -> c -> Bool
wb l a c = putget l a c && getput l c && createget l a
putget :: (Eq a,Eq c) => Lens c a -> a -> c -> Bool
putget l a c = get l (put l (a,c)) == a
getput :: Eq c => Lens c a -> c -> Bool
getput l c = put l (get l c,c) == c
createget :: Eq a => Lens c a -> a -> Bool
createget l a = get l (create l a) == a