summaryrefslogtreecommitdiff
blob: 3e0ee48d35258d23429f7da791936404d2cd0b76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
	<maintainer type="project">
		<email>haskell@gentoo.org</email>
		<name>Gentoo Haskell</name>
	</maintainer>
	<longdescription>
		Typical buffer&amp;#x2013;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&amp;#x2013;purpose; it is difficult or impossible to compose
		buffer&amp;#x2013;based processing loops.
		
		Haskell&amp;#x2019;s concept of &amp;#x201C;lazy I/O&amp;#x201D; 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&amp;#x2013;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.
	</longdescription>
</pkgmetadata>