44 lines
1.2 KiB
Haskell
44 lines
1.2 KiB
Haskell
{-# LANGUAGE RankNTypes #-}
|
|
{-|
|
|
Module : Control.Lens
|
|
Description : Simplified functional lenses
|
|
Copyright : (c) Mats Rauhala, 2019
|
|
License : BSD3
|
|
Maintainer : mats.rauhala@iki.fi
|
|
Stability : experimental
|
|
Portability : POSIX
|
|
|
|
A very small subset of the lens library reimplemented
|
|
|
|
See http://hackage.haskell.org/package/lens for proper docs
|
|
-}
|
|
module Control.Lens where
|
|
|
|
import Control.Monad.Reader (MonadReader, asks)
|
|
import Data.Functor.Const (Const (..))
|
|
import Data.Functor.Identity (Identity (..))
|
|
|
|
-- | Full lens type
|
|
type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
|
|
|
|
-- | Simplified lens type
|
|
type Lens' s b = Lens s s b b
|
|
|
|
-- | Build a lens out of a getter and a setter
|
|
lens :: (s -> a) -> (s -> b -> t) -> Lens s t a b
|
|
lens sa sbt afb s = sbt s <$> afb (sa s)
|
|
|
|
-- | Getting a value
|
|
type Getting r s a = (a -> Const r a) -> s -> Const r s
|
|
|
|
-- | View a value
|
|
view :: MonadReader r m => Getting a r a -> m a
|
|
view l = asks (getConst . l Const)
|
|
|
|
-- | Settering a value
|
|
type ASetter s t a b = (a -> Identity b) -> s -> Identity t
|
|
|
|
-- | Set a value
|
|
set :: ASetter s t a b -> b -> s -> t
|
|
set l b = runIdentity . l (\_ -> Identity b)
|