packages feed

cornea-0.2.0.0: lib/Control/Monad/DeepState.hs

module Control.Monad.DeepState where

import qualified Control.Lens as Lens (set, view)
import Control.Monad.State.Class (MonadState)
import qualified Control.Monad.State.Class as MS (MonadState(get), modify)

import Data.DeepLenses (DeepLenses(deepLens))

class (MonadState s m, DeepLenses s s') => MonadDeepState s s' m where
  get :: m s'
  put :: s' -> m ()
  state :: (s' -> m (a, s')) -> m a

instance (MonadState s m, DeepLenses s s') => MonadDeepState s s' m where
  get = Lens.view deepLens <$> MS.get
  put = MS.modify . Lens.set deepLens
  state f = do
    s' <- get
    ~(a, s'') <- f s'
    put s''
    return a

gets :: MonadDeepState s s' m => (s' -> a) -> m a
gets =
  (<$> get)