packages feed

riak-1.2.0.0: src/Network/Riak/Lens.hs

{-# LANGUAGE RankNTypes #-}

module Network.Riak.Lens
  ( (&)
  , (^.)
  , (.~)
  , (%~)
  , mapped
  ) where

import Data.Function ((&))
import Data.Functor.Const
import Data.Functor.Identity

type Lens s a
  = forall f. Functor f => (a -> f a) -> (s -> f s)

type Setter s a
  = (a -> Identity a) -> (s -> Identity s)

infixl 8 ^.
(^.) :: s -> Lens s a -> a
s ^. l =
  getConst (l Const s)

infixr 4 .~
(.~) :: Setter s a -> a -> s -> s
(l .~ a) s =
  runIdentity (l (\_ -> Identity a) s)

infixr 4 %~
(%~) :: Setter s a -> (a -> a) -> (s -> s)
(l %~ f) s =
  runIdentity (l (\a -> Identity (f a)) s)


mapped :: Functor f => Setter (f a) a
mapped f s =
  Identity (fmap (runIdentity . f) s)