{-# OPTIONS -fno-warn-orphans #-} {-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} ----------------------------------------------------------------------------- -- | -- Module : Control.Monad.StateX.Class -- Copyright : (c) Mark Snyder 2008. -- License : BSD-style -- Maintainer : Mark Snyder, marks@ittc.ku.edu -- Stability : experimental -- Portability : non-portable (multi-param classes, functional dependencies) ----------------------------------------------------------------------------- module Control.Monad.StateX.Class ( MonadStateX(..), modifyx, getsx, ) where import Control.Monad.Index -- --------------------------------------------------------------------------- class (Monad m, Index ix) => MonadStateX ix s m | ix m -> s where getx :: ix -> m s putx :: ix -> s -> m () modifyx :: (MonadStateX ix s m) => ix -> (s -> s) -> m () modifyx ix f = do s <- getx ix putx ix (f s) getsx :: (MonadStateX ix s m) => ix -> (s -> a) -> m a getsx ix f = do s <- getx ix return (f s)