{- | Access helper functions in a State monad -} module Data.Accessor.MonadState where import qualified Data.Accessor.Basic as Accessor import qualified Control.Monad.State as State import Control.Monad.State (MonadState, ) set :: MonadState r m => Accessor.T r a -> a -> m () set f x = State.modify (Accessor.set f x) get :: MonadState r m => Accessor.T r a -> m a get f = State.gets (Accessor.get f) modify :: MonadState r m => Accessor.T r a -> (a -> a) -> m () modify f g = State.modify (Accessor.modify f g) {- | Modify a record element and return its old value. -} getAndModify :: MonadState r m => Accessor.T r a -> (a -> a) -> m a getAndModify f g = do x <- get f modify f g return x {- | Modify a record element and return its new value. -} modifyAndGet :: MonadState r m => Accessor.T r a -> (a -> a) -> m a modifyAndGet f g = do modify f g get f infix 1 %=, %: {- | Infix variant of 'set'. -} (%=) :: MonadState r m => Accessor.T r a -> a -> m () (%=) = set {- | Infix variant of 'modify'. -} (%:) :: MonadState r m => Accessor.T r a -> (a -> a) -> m () (%:) = modify