| Safe Haskell | Safe-Inferred |
|---|
Control.Proxy.ListT
Description
This module implements "ListT done right" in terms of proxies.
The RespondT monad transformer is the ListT monad transformer over the
downstream output type. Each respond corresponds to an element of the
list. The monad bind operation non-deterministically selects one of the
previous responds as input. The RespondT Kleisli category corresponds
to the "respond" category of the ListT class.
Symmetrically, the RequestT monad transformer is the ListT monad
transformer over the upstream output type. Each request corresponds to an
element of the list. The monad bind operation non-deterministically selects
one of the previous requests as input. The RequestT Kleisli category
corresponds to the "request" category of the ListT class.
Unlike ListT from transformers, these monad transformers are correct by
construction and always satisfy the monad and monad transformer laws.
- newtype RespondT p a' a b' m b = RespondT {
- runRespondT :: p a' a b' b m b'
- runRespondK :: (q -> RespondT p a' a b' m b) -> q -> p a' a b' b m b'
- type ProduceT p = RespondT p C () ()
- newtype RequestT p a b' b m a' = RequestT {
- runRequestT :: p a' a b' b m a
- runRequestK :: (q -> RequestT p a b' b m a') -> q -> p a' a b' b m a
- type CoProduceT p = RequestT p () () C
- class Proxy p => ListT p where
- (\>\) :: (Monad m, ListT p) => (b' -> p a' a x' x m b) -> (_c' -> p b' b x' x m c) -> _c' -> p a' a x' x m c
- (/>/) :: (Monad m, ListT p) => (_a -> p x' x b' b m a') -> (b -> p x' x c' c m b') -> _a -> p x' x c' c m a'
- (/</) :: (Monad m, ListT p) => (_c' -> p b' b x' x m c) -> (b' -> p a' a x' x m b) -> _c' -> p a' a x' x m c
- (\<\) :: (Monad m, ListT p) => (b -> p x' x c' c m b') -> (_a -> p x' x b' b m a') -> _a -> p x' x c' c m a'
- (//<) :: (Monad m, ListT p) => p b' b x' x m c -> (b' -> p a' a x' x m b) -> p a' a x' x m c
- (<\\) :: (Monad m, ListT p) => (b -> p x' x c' c m b') -> p x' x b' b m a' -> p x' x c' c m a'
Respond Monad Transformer
newtype RespondT p a' a b' m b Source
A monad transformer over a proxy's downstream output
Constructors
| RespondT | |
Fields
| |
Instances
| ListT p => MonadTrans (RespondT p a' a b') | |
| (Monad m, ListT p) => Monad (RespondT p a' a b' m) | |
| (Monad m, ListT p) => Functor (RespondT p a' a b' m) | |
| (Monad m, ListT p, Monoid b') => MonadPlus (RespondT p a' a b' m) | |
| (Monad m, ListT p) => Applicative (RespondT p a' a b' m) | |
| (Monad m, ListT p, Monoid b') => Alternative (RespondT p a' a b' m) | |
| (MonadIO m, ListT p) => MonadIO (RespondT p a' a b' m) |
runRespondK :: (q -> RespondT p a' a b' m b) -> q -> p a' a b' b m b'Source
Convert a RespondT 'K'leisli arrow into a proxy
Request Monad Transformer
newtype RequestT p a b' b m a' Source
A monad transformer over a proxy's upstream output
Constructors
| RequestT | |
Fields
| |
Instances
| ListT p => MonadTrans (RequestT p a' a b') | |
| (Monad m, ListT p) => Monad (RequestT p a b' b m) | |
| (Monad m, ListT p) => Functor (RequestT p a b' b m) | |
| (Monad m, ListT p, Monoid a) => MonadPlus (RequestT p a b' b m) | |
| (Monad m, ListT p) => Applicative (RequestT p a b' b m) | |
| (Monad m, ListT p, Monoid a) => Alternative (RequestT p a b' b m) | |
| (MonadIO m, ListT p) => MonadIO (RequestT p a b' b m) |
runRequestK :: (q -> RequestT p a b' b m a') -> q -> p a' a b' b m aSource
Convert a RequestT 'K'leisli arrow into a proxy
type CoProduceT p = RequestT p () () CSource
CoProduceT is isomorphic to "ListT done right"
ListT
class Proxy p => ListT p whereSource
The two generalized "ListT" categories
(\>\) :: (Monad m, ListT p) => (b' -> p a' a x' x m b) -> (_c' -> p b' b x' x m c) -> _c' -> p a' a x' x m cSource
(/>/) :: (Monad m, ListT p) => (_a -> p x' x b' b m a') -> (b -> p x' x c' c m b') -> _a -> p x' x c' c m a'Source
Flipped operators
(/</) :: (Monad m, ListT p) => (_c' -> p b' b x' x m c) -> (b' -> p a' a x' x m b) -> _c' -> p a' a x' x m cSource
Equivalent to (\>\) with the arguments flipped
(\<\) :: (Monad m, ListT p) => (b -> p x' x c' c m b') -> (_a -> p x' x b' b m a') -> _a -> p x' x c' c m a'Source
Equivalent to (/>/) with the arguments flipped
(//<) :: (Monad m, ListT p) => p b' b x' x m c -> (b' -> p a' a x' x m b) -> p a' a x' x m cSource
Equivalent to (>\\) with the arguments flipped
(<\\) :: (Monad m, ListT p) => (b -> p x' x c' c m b') -> p x' x b' b m a' -> p x' x c' c m a'Source
Equivalent to (//>) with the arguments flipped
Laws
The ListT class defines the ability to:
Laws:
return = respond (>=>) = (//>)
return = request (>>=) = (//<)
Additionally, (\>\) and (/>/) both define functors between Proxy Kleisli
categories:
a \>\ (b >=> c) = (a \>\ b) >=> (a \>\ c) a \>\ return = return
(b >=> c) />/ a = (b />/ a) >=> (c />/ a) return />/ a = return