drinkery
drinkery is a yet another stream processing library themed on liquors. While it
offers a simple interface, it also tries to be as expressive as possible.
Producers
drinkery supports three types of producers: Producer
, ListT
, and Tap
.
Producer r s
is a monad transformer to produce a stream of type s
. It is good
at interactively serving values.
yield :: s -> Producer r s m a
is the primary action.
A barman can also accept requests from the downstream using accept
.
ListT r
is a list-like backtracking monad (also known as ListT done right).
It is useful for sampling elements of containers with effects.
sample :: Foldable f => f s -> ListT r m s
samples elements in any Foldable
container. inquire
to interact with the downstream.
Tap
is an endless producer. This can be connected to a ‘Patron’ or a ‘Distiller’.
Producer
and ListT
are converted to Tap
by runProducer
and runListT
respectively.
Consumer
Sink tap
is a monad transformer which consumes tap
.
drink :: m s
Get one element.
leftover :: s -> m ()
Leave one element.
request :: r -> m ()
Send a request.
(+&) :: (Monoid r, CloseRequest r, Monad m) => Tap r s m -> Sink (Tap r s) m a -> m a
connects a tap with a drinker.
Transducer
Distiller tap m r s
is a stream transducer which
- Consumes
tap
- Receives
r
- Produces
s
It is actually a Tap
where the underlying monad is Sink
.
There are two composition operators:
++&
Tap-drinker
++$
Tap-distiller
+
, &
, and $
means a tap, a drinker, and a distiller respectively. The middle
characters of these operators signify the resulting structures.
Why drinkery?
drinkery is designed to be fully featured and complements other libraries’ missing
functionalities.
pipes
pipes
is quite similar in that both Proxy
and Distiller
are bidirectional.
Still there are some differences:
Distiller
does not terminate.
- Unlike pipes’
>->
, ++$
propagates inner requests:
(++$) :: Monad m => Distiller tap m p q -> Distiller (Tap p q) (Sink tap m) r s -> Distiller tap m r s
(>->) :: Proxy a' a () b m r -> Proxy () b c' c m r -> Proxy a' a c' c m r
Sink
, the consumer monad, may leave unconsumed inputs.
drinkery
has much fewer operators.
conduit
Both drinkery
and conduit
support leftovers, closing operation, and end of stream.
The main difference is interactivity.
machines
machines
does not support leftovers, nor interactive producers.
Both machines
and drinkery
support multi-channel input.
iteratee
iteratee
has an ability to handle requests but those are untyped (SomeException
).
drinkery
provides a more robust interface for handling requests, and monadic producers.