module Validations.Internal.Lens
( getter
, setter
, lens
, Lens
) where
import Control.Monad.Identity(Identity(Identity), runIdentity)
import Control.Applicative(Const(Const), getConst, (<$>))
type Lens a s = (Functor f) => (a -> f a) -> s -> f s
getter :: (forall f. (Functor f) => (a -> f a) -> s -> f s) -> s -> a
getter lns x = getConst $ lns (\y -> Const y) x
setter :: (forall f. (Functor f) => (a -> f a) -> s -> f s) -> s -> a -> s
setter lns x y = runIdentity $ lns (\_ -> Identity y) x
lens :: (Functor f) => (s -> a) -> (s -> a -> s) -> (a -> f a) -> s -> f s
lens get set lift input = set input <$> (lift . get) input