state-bag-0.1.0.0: Monad transformers for holding bags of state.

Safe HaskellNone
LanguageHaskell2010

Control.Monad.Trans.StateBag.Primitive

Description

State bag monad transformer which runs on a PrimMonad stack.

Synopsis

Documentation

data StateBaggerT full bag m a Source #

Monad transformer for building state bags.

Instances

MonadTrans (StateBaggerT full bag) Source # 

Methods

lift :: Monad m => m a -> StateBaggerT full bag m a #

Monad m => Monad (StateBaggerT full bag m) Source # 

Methods

(>>=) :: StateBaggerT full bag m a -> (a -> StateBaggerT full bag m b) -> StateBaggerT full bag m b #

(>>) :: StateBaggerT full bag m a -> StateBaggerT full bag m b -> StateBaggerT full bag m b #

return :: a -> StateBaggerT full bag m a #

fail :: String -> StateBaggerT full bag m a #

Functor m => Functor (StateBaggerT full bag m) Source # 

Methods

fmap :: (a -> b) -> StateBaggerT full bag m a -> StateBaggerT full bag m b #

(<$) :: a -> StateBaggerT full bag m b -> StateBaggerT full bag m a #

Applicative m => Applicative (StateBaggerT full bag m) Source # 

Methods

pure :: a -> StateBaggerT full bag m a #

(<*>) :: StateBaggerT full bag m (a -> b) -> StateBaggerT full bag m a -> StateBaggerT full bag m b #

(*>) :: StateBaggerT full bag m a -> StateBaggerT full bag m b -> StateBaggerT full bag m b #

(<*) :: StateBaggerT full bag m a -> StateBaggerT full bag m b -> StateBaggerT full bag m a #

MonadIO m => MonadIO (StateBaggerT full bag m) Source # 

Methods

liftIO :: IO a -> StateBaggerT full bag m a #

PrimMonad m => PrimMonad (StateBaggerT full bag m) Source # 

Associated Types

type PrimState (StateBaggerT full bag m :: * -> *) :: * #

Methods

primitive :: (State# (PrimState (StateBaggerT full bag m)) -> (#VoidRep, PtrRepLifted, State# (PrimState (StateBaggerT full bag m)), a#)) -> StateBaggerT full bag m a #

type PrimState (StateBaggerT full bag m) Source # 
type PrimState (StateBaggerT full bag m) = PrimState m

runBagger :: forall full m a. (PrimMonad m, ElementCount full) => StateBaggerT full '[] m a -> m a Source #

Run an empty state bagger on top of a monad stack.

addItem :: forall item full bag m a. (PrimMonad m, ElementIndex item full) => item -> StateBaggerT full (item ': bag) m a -> StateBaggerT full bag m a Source #

Run a state bagger with one additional item.

topItem :: forall item full bag m. (PrimMonad m, ElementIndex item full) => StateBaggerT full (item ': bag) m item Source #

Get the value of the top item in a state bagger.

stackItem :: forall item full bag m a. (PrimMonad m, ElementIndex item full) => item -> StateBaggerT full (item ': bag) m a -> StateBaggerT full bag m (a, item) Source #

Run a state bagger with one additional item and capture the final value of that item on return.

data StateBagT bag m a Source #

State bag monad transformer where the state items are represented by the type-level list bag.

Instances

MonadTrans (StateBagT bag) Source # 

Methods

lift :: Monad m => m a -> StateBagT bag m a #

Monad m => Monad (StateBagT bag m) Source # 

Methods

(>>=) :: StateBagT bag m a -> (a -> StateBagT bag m b) -> StateBagT bag m b #

(>>) :: StateBagT bag m a -> StateBagT bag m b -> StateBagT bag m b #

return :: a -> StateBagT bag m a #

fail :: String -> StateBagT bag m a #

Functor m => Functor (StateBagT bag m) Source # 

Methods

fmap :: (a -> b) -> StateBagT bag m a -> StateBagT bag m b #

(<$) :: a -> StateBagT bag m b -> StateBagT bag m a #

Applicative m => Applicative (StateBagT bag m) Source # 

Methods

pure :: a -> StateBagT bag m a #

(<*>) :: StateBagT bag m (a -> b) -> StateBagT bag m a -> StateBagT bag m b #

(*>) :: StateBagT bag m a -> StateBagT bag m b -> StateBagT bag m b #

(<*) :: StateBagT bag m a -> StateBagT bag m b -> StateBagT bag m a #

MonadIO m => MonadIO (StateBagT bag m) Source # 

Methods

liftIO :: IO a -> StateBagT bag m a #

PrimMonad m => PrimMonad (StateBagT bag m) Source # 

Associated Types

type PrimState (StateBagT bag m :: * -> *) :: * #

Methods

primitive :: (State# (PrimState (StateBagT bag m)) -> (#VoidRep, PtrRepLifted, State# (PrimState (StateBagT bag m)), a#)) -> StateBagT bag m a #

PrimMonad m => StateBagMonad (StateBagT bag m) Source # 

Associated Types

type Bag (StateBagT bag m :: * -> *) :: [*] Source #

type BagBase (StateBagT bag m :: * -> *) :: * -> * Source #

Methods

getItem :: ElementIndex item (Bag (StateBagT bag m)) => StateBagT bag m item Source #

putItem :: ElementIndex item (Bag (StateBagT bag m)) => item -> StateBagT bag m () Source #

modifyItemM :: ElementIndex item (Bag (StateBagT bag m)) => (item -> StateBagT bag m item) -> StateBagT bag m () Source #

type PrimState (StateBagT bag m) Source # 
type PrimState (StateBagT bag m) = PrimState m
type Bag (StateBagT bag m) Source # 
type Bag (StateBagT bag m) = bag
type BagBase (StateBagT bag m) Source # 
type BagBase (StateBagT bag m) = m

makeBag :: forall bag m a. (PrimMonad m, ElementCount bag) => StateBagT bag m a -> StateBaggerT bag bag m a Source #

Runs a state bag with the items prepared in a state bagger.

getItem :: forall m item bag. (PrimMonad m, ElementIndex item bag) => StateBagT bag m item Source #

Gets the current value of item from the bag.

putItem :: forall m item bag. (PrimMonad m, ElementIndex item bag) => item -> StateBagT bag m () Source #

Stores a new value of item in the bag.

modifyItemM :: forall m item bag. (PrimMonad m, ElementIndex item bag) => (item -> StateBagT bag m item) -> StateBagT bag m () Source #

Applies a monadic function to an item in the bag and stores the result.

class ElementCount a Source #

Type-class for counting the number of elements in a type-level list.

Minimal complete definition

elemCount

Instances

ElementCount ([] *) Source # 

Methods

elemCount :: Proxy [*] [*] -> Int

ElementCount xs => ElementCount ((:) * x xs) Source # 

Methods

elemCount :: Proxy [*] ((* ': x) xs) -> Int

class ElementIndex x xs Source #

Type-class for finding the index of an element in a type-level list.

Minimal complete definition

elemIndex

Instances

ElementIndex x xs => ElementIndex x ((:) * y xs) Source # 

Methods

elemIndex :: Proxy * x -> Proxy [*] ((* ': y) xs) -> Int

ElementIndex x ((:) * x xs) Source # 

Methods

elemIndex :: Proxy * x -> Proxy [*] ((* ': x) xs) -> Int