{- | 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