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