fclabels-0.11.0: src/Data/Record/Label/Monadic.hs
{-# LANGUAGE TypeOperators, TypeSynonymInstances, TemplateHaskell #-}
module Data.Record.Label.Monadic
(
-- * Monadic lens operations.
getM, setM, modM, (=:)
, askM, localM
)
where
import Control.Monad.State
import Control.Monad.Reader
import Data.Record.Label.Core
-- | Get a value out of state pointed to by the specified lens.
getM :: MonadState s m => s :-> b -> m b
getM = gets . getL
-- | Set a value somewhere in state pointed to by the specified lens.
setM :: MonadState s m => s :-> b -> b -> m ()
setM l = modify . setL l
-- | Alias for `setM' that reads like an assignment.
infixr 7 =:
(=:) :: MonadState s m => s :-> b -> b -> m ()
(=:) = setM
-- | Modify a value with a function somewhere in state pointed to by the
-- specified lens.
modM :: MonadState s m => s :-> b -> (b -> b) -> m ()
modM l = modify . modL l
-- | Fetch a value pointed to by a lens out of a reader environment.
askM :: MonadReader r m => (r :-> b) -> m b
askM = asks . getL
-- | Execute a computation in a modified environment. The lens is used to
-- point out the part to modify.
localM :: MonadReader r m => (r :-> b) -> (b -> b) -> m a -> m a
localM l f = local (modL l f)