module Control.Monad.Trans.StateBag.Class (
StateBagMonad(
Bag,
BagBase,
getItem,
putItem,
modifyItemM),
ElementCount(),
ElementIndex()
) where
import Control.Monad.Primitive
import Control.Monad.Trans.StateBag.Internal
import qualified Control.Monad.Trans.StateBag.Pure as Pure
import qualified Control.Monad.Trans.StateBag.Primitive as Prim
class (Monad m) => StateBagMonad (m :: * -> *) where
type Bag m :: [*]
type BagBase m :: * -> *
getItem :: (ElementIndex item (Bag m)) => m item
putItem :: (ElementIndex item (Bag m)) => item -> m ()
modifyItemM :: (ElementIndex item (Bag m)) => (item -> m item) -> m ()
modifyItemM f = getItem >>= f >>= putItem
instance (Monad m) => StateBagMonad (Pure.StateBagT bag m) where
type Bag (Pure.StateBagT bag m) = bag
type BagBase (Pure.StateBagT bag m) = m
getItem = Pure.getItem
putItem = Pure.putItem
modifyItemM = Pure.modifyItemM
instance (PrimMonad m) => StateBagMonad (Prim.StateBagT bag m) where
type Bag (Prim.StateBagT bag m) = bag
type BagBase (Prim.StateBagT bag m) = m
getItem = Prim.getItem
putItem = Prim.putItem
modifyItemM = Prim.modifyItemM