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