enumerator: Reliable, high-performance processing with left-fold enumerators

[ data, deprecated, enumerator, library, mit ] [ Propose Tags ]
Deprecated.

Typical buffer–based incremental I/O is based around a single loop, which reads data from some source (such as a socket or file), transforms it, and generates one or more outputs (such as a line count, HTTP responses, or modified file). Although efficient and safe, these loops are all single–purpose; it is difficult or impossible to compose buffer–based processing loops.

Haskell’s concept of “lazy I/O” allows pure code to operate on data from an external source. However, lazy I/O has several shortcomings. Most notably, resources such as memory and file handles can be retained for arbitrarily long periods of time, causing unpredictable performance and error conditions.

Enumerators are an efficient, predictable, and safe alternative to lazy I/O. Discovered by Oleg Kiselyov, they allow large datasets to be processed in near–constant space by pure code. Although somewhat more complex to write, using enumerators instead of lazy I/O produces more correct programs.

This library contains an enumerator implementation for Haskell, designed to be both simple and efficient. Three core types are defined, along with numerous helper functions:

  • Iteratee: Data sinks, analogous to left folds. Iteratees consume a sequence of input values, and generate a single output value. Many iteratees are designed to perform side effects (such as printing to stdout), so they can also be used as monad transformers.

  • Enumerator: Data sources, which generate input sequences. Typical enumerators read from a file handle, socket, random number generator, or other external stream. To operate, enumerators are passed an iteratee, and provide that iteratee with input until either the iteratee has completed its computation, or EOF.

  • Enumeratee: Data transformers, which operate as both enumerators and iteratees. Enumeratees read from an outer enumerator, and provide the transformed data to an inner iteratee.

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1, 0.1.1, 0.2, 0.2.1, 0.3, 0.3.0.1, 0.4, 0.4.0.1, 0.4.0.2, 0.4.1, 0.4.2, 0.4.3, 0.4.3.1, 0.4.4, 0.4.5, 0.4.6, 0.4.7, 0.4.8, 0.4.9, 0.4.9.1, 0.4.10, 0.4.11, 0.4.12, 0.4.13, 0.4.13.1, 0.4.14, 0.4.15, 0.4.16, 0.4.17, 0.4.18, 0.4.19, 0.4.20
Dependencies base (>=4.0 && <4.11), bytestring (>=0.9), containers (>=0.1), text (>=0.7), transformers (>=0.2) [details]
License MIT
Copyright 2010-2011 John Millikin, 2011 Mikhail Vorozhtsov
Author John Millikin <jmillikin@gmail.com>
Maintainer jmillikin@gmail.com
Revised Revision 1 made by HerbertValerioRiedel at 2018-10-01T12:05:32Z
Category Data, Enumerator
Home page https://john-millikin.com/software/enumerator/
Bug tracker mailto:jmillikin@gmail.com
Source repo head: git clone https://john-millikin.com/code/haskell-enumerator/
this: git clone https://john-millikin.com/code/haskell-enumerator/(tag haskell-enumerator_0.4.20)
Uploaded by JohnMillikin at 2013-10-13T01:39:33Z
Distributions FreeBSD:0.4.20, NixOS:0.4.20
Downloads 58878 total (110 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Successful builds reported [all 1 reports]