{-# LANGUAGE MultiParamTypeClasses , FlexibleInstances #-} module Control.Monad.State.Sub where import Data.Set.Class as Sets import Control.Monad.State import Control.Monad.Reader -- | > lookup i =<< (putSingle x >> getTotal) ~ return (Just x) class MonadSubState i a s m where getTotal :: m s putSingle :: a -> m () instance ( HasInsertWith i a s , MonadState s m , MonadReader i m ) => MonadSubState i a s m where getTotal = get putSingle x = do i <- ask s <- get put $ insertWith i x s