pipes: Compositional pipelines
"Iteratees done right". This library implements iteratees/enumerators/enumeratees simply and elegantly, but uses different naming conventions.
Advantages over traditional iteratee implementations:
Simpler semantics: There is only one data type (
Pipe
), two primitives (await
andyield
), and only one way to composePipe
s (.
). In fact, this library introduces no new operators, using only itsMonad
andCategory
instances to implement all behavior.Clearer naming conventions: Enumeratees are called
Pipe
s, Enumerators areProducer
s, and Iteratees areConsumer
s.Producer
s andConsumer
s are just type synonyms forPipe
s with either the input or output end closed.Pipes are Categories: You compose them using ordinary composition. There are actually two
Category
instances: one forLazy
composition and one forStrict
composition. Both instances satisfy theCategory
laws.Intuitive: Pipe composition is easier to reason about because it is a true
Category
. Composition works seamlessly and you don't have to worry about restarting iteratees, feeding new input, etc. "It just works".Vertical concatenation works flawlessly on everything: (
>>
) concatenatesPipe
s, but since everything is aPipe
, you can use it to concatenateProducer
s,Consumer
s, and even intermediatePipe
stages. Vertical Concatenation always works the way you expect, picking up where the previousPipe
left off.Symmetric implementation: Most iteratee libraries are either enumerator-driven or iteratee-driven.
Pipe
s are implemented symmetrically, which is why they can be composed with eitherLazy
(Consumer
-driven) orStrict
(Producer
-driven) semantics.
Check out Control.Pipe for a copious introduction (in the spirit of the
iterIO
library) and Control.Pipe.Common for the actual implementation.
This library does not yet provide convenience Pipe
s for common operations,
but they are forthcoming. However, there are several examples in the
documentation to get you started and I encourage you to write your own to see
how easy they are to write.
Downloads
- pipes-1.0.1.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
Versions [RSS] | 1.0, 1.0.1, 1.0.2, 2.0.0, 2.1.0, 2.2.0, 2.3.0, 2.4.0, 2.5.0, 3.0.0, 3.1.0, 3.2.0, 3.3.0, 4.0.0, 4.0.1, 4.0.2, 4.1.0, 4.1.1, 4.1.2, 4.1.3, 4.1.4, 4.1.5, 4.1.6, 4.1.7, 4.1.8, 4.1.9, 4.2.0, 4.3.0, 4.3.1, 4.3.2, 4.3.3, 4.3.4, 4.3.5, 4.3.6, 4.3.7, 4.3.8, 4.3.9, 4.3.10, 4.3.11, 4.3.12, 4.3.13, 4.3.14, 4.3.15, 4.3.16 |
---|---|
Dependencies | base (>=4 && <5), mtl [details] |
Tested with | ghc ==7.0.3 |
License | BSD-3-Clause |
Copyright | 2012 Gabriel Gonzalez |
Author | Gabriel Gonzalez |
Maintainer | Gabriel439@gmail.com |
Category | Control, Enumerator |
Bug tracker | mailto:Gabriel439@gmail.com |
Source repo | head: git clone https://github.com/Gabriel439/Haskell-Pipes-Library |
Uploaded | by GabrielGonzalez at 2012-02-01T18:00:52Z |
Distributions | Arch:4.3.16, Debian:4.3.14, Fedora:4.3.16, LTSHaskell:4.3.16, NixOS:4.3.16, Stackage:4.3.16 |
Reverse Dependencies | 188 direct, 172 indirect [details] |
Downloads | 105576 total (434 in the last 30 days) |
Rating | 2.75 (votes: 10) [estimated by Bayesian average] |
Your Rating | |
Status | Docs available [build log] Last success reported on 2016-06-04 [all 1 reports] |