ANNOUNCE: enumerator 0.4.8

John Millikin jmillikin at
Sat Mar 26 06:39:44 CET 2011

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.

Hello -cafe,

It's been a while since the last point release of enumerator. This one
is sufficiently large that I think folks might want to know about it,
and since I try not to spam too many announcements, I'll give a quick
rundown on major changes in other 0.4.x versions as well.

First, most of what I call "list analogues" -- enumerator-based
versions of 'head', 'take', 'map', etc -- have been separated into
three modules (Data.Enumerator.List, .Binary, and .Text) depending on
what sorts of data they operate on. This separation has been an
ongoing process throughout 0.4.x releases, and I think it's now
complete. The old names in Data.Enumerator will continue to exist in
0.4.x versions, but will be removed in 0.5.

Second, Gregory Collins and Ertugrul Soeylemez found a space leak in
Iteratee's (>>=), which could cause eventual space exhaustion in some
circumstances. If you use enumerators to process very large or
infinite streams, you probably want to upgrade to version 0.4.7 or

Third, the source code PDF has seen some substantial improvement -- if
you're interested in how the library is implemented, or have insomnia,
read it at <

Finally, there is a known issue in the current encoding of iteratees
-- if an iteratee yields extra data but never consumed anything, that
iteratee will violate the monad law of associativity. Oleg has updated
his implementations to fix this problem, but since it would break a
*lot* of dependent libraries, I'm holding off until the vague future
of version 0.5. Since iteratees that yield extra data they didn't
consume are invalid anyway, I hope this problem will not cause too
much inconvenience.

New features

* Range-limited binary file enumeration (requested + initial patch by
Bardur Arantsson).

* splitWhen , based on the "split" package < >

* 0.4.6: Typeable instances for most types (requested by Michael Snoyman)

* 0.4.5: joinE , which simplifies enumerator/enumeratee composition
(requested by Michael Snoyman)

More information about the Libraries mailing list