This file is indexed.

/usr/share/doc/libghc-enumerator-doc/html/src/Data-Enumerator-Internal.html is in libghc-enumerator-doc 0.4.19-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>lib/Data/Enumerator/Internal.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-- |</span>
<a name="line-2"></a><span class='hs-comment'>-- Module: Data.Enumerator.Internal</span>
<a name="line-3"></a><span class='hs-comment'>-- Copyright: 2010-2011 John Millikin</span>
<a name="line-4"></a><span class='hs-comment'>-- License: MIT</span>
<a name="line-5"></a><span class='hs-comment'>--</span>
<a name="line-6"></a><span class='hs-comment'>-- Maintainer: jmillikin@gmail.com</span>
<a name="line-7"></a><span class='hs-comment'>-- Portability: portable</span>
<a name="line-8"></a><span class='hs-comment'>--</span>
<a name="line-9"></a><span class='hs-comment'>-- Core enumerator types, and some useful primitives.</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- Be careful when using the functions defined in this module, as they will</span>
<a name="line-12"></a><span class='hs-comment'>-- allow you to create iteratees which violate the monad laws.</span>
<a name="line-13"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Enumerator</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span>
<a name="line-14"></a>	<span class='hs-layout'>(</span> <span class='hs-conid'>Stream</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-15"></a>	<span class='hs-layout'>,</span> <span class='hs-conid'>Iteratee</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-16"></a>	<span class='hs-layout'>,</span> <span class='hs-conid'>Step</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-17"></a>	<span class='hs-layout'>,</span> <span class='hs-conid'>Enumerator</span>
<a name="line-18"></a>	<span class='hs-layout'>,</span> <span class='hs-conid'>Enumeratee</span>
<a name="line-19"></a>	
<a name="line-20"></a>	<span class='hs-comment'>-- * Primitives</span>
<a name="line-21"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>returnI</span>
<a name="line-22"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>continue</span>
<a name="line-23"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>yield</span>
<a name="line-24"></a>	
<a name="line-25"></a>	<span class='hs-comment'>-- * Operators</span>
<a name="line-26"></a>	<span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;==</span><span class='hs-layout'>)</span>
<a name="line-27"></a>	<span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>==&lt;&lt;</span><span class='hs-layout'>)</span>
<a name="line-28"></a>	<span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span>
<a name="line-29"></a>	<span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;==&gt;</span><span class='hs-layout'>)</span>
<a name="line-30"></a>	<span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;==&lt;</span><span class='hs-layout'>)</span>
<a name="line-31"></a>	
<a name="line-32"></a>	<span class='hs-comment'>-- * Miscellaneous</span>
<a name="line-33"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>enumEOF</span>
<a name="line-34"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>checkContinue0</span>
<a name="line-35"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>checkContinue1</span>
<a name="line-36"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>checkDoneEx</span>
<a name="line-37"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>checkDone</span>
<a name="line-38"></a>	
<a name="line-39"></a>	<span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-40"></a>
<a name="line-41"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>A</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Exc</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>CM</span>
<a name="line-44"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Class</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadIO</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftIO</span><span class='hs-layout'>)</span>
<a name="line-45"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Trans</span><span class='hs-varop'>.</span><span class='hs-conid'>Class</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadTrans</span><span class='hs-layout'>,</span> <span class='hs-varid'>lift</span><span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Function</span> <span class='hs-layout'>(</span><span class='hs-varid'>fix</span><span class='hs-layout'>)</span>
<a name="line-47"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>Monoid</span><span class='hs-layout'>,</span> <span class='hs-varid'>mempty</span><span class='hs-layout'>,</span> <span class='hs-varid'>mappend</span><span class='hs-layout'>,</span> <span class='hs-varid'>mconcat</span><span class='hs-layout'>)</span>
<a name="line-48"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Typeable</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeOf</span>
<a name="line-49"></a>                               <span class='hs-layout'>,</span> <span class='hs-conid'>Typeable1</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeOf1</span>
<a name="line-50"></a>                               <span class='hs-layout'>,</span> <span class='hs-varid'>mkTyConApp</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTyCon</span><span class='hs-layout'>)</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="Stream"></a><span class='hs-comment'>-- | A 'Stream' is a sequence of chunks generated by an 'Enumerator'.</span>
<a name="line-53"></a><a name="Stream"></a><span class='hs-comment'>--</span>
<a name="line-54"></a><a name="Stream"></a><span class='hs-comment'>-- @('Chunks' [])@ is used to indicate that a stream is still active, but</span>
<a name="line-55"></a><a name="Stream"></a><span class='hs-comment'>-- currently has no available data. Iteratees should ignore empty chunks.</span>
<a name="line-56"></a><a name="Stream"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span>
<a name="line-57"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>Chunks</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-58"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>EOF</span>
<a name="line-59"></a>	<span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>)</span>
<a name="line-60"></a>
<a name="line-61"></a><a name="instance%20Monad%20Stream"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-conid'>Stream</span> <span class='hs-keyword'>where</span>
<a name="line-62"></a>	<span class='hs-varid'>return</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Chunks</span> <span class='hs-varop'>.</span> <span class='hs-varid'>return</span>
<a name="line-63"></a>	<span class='hs-conid'>Chunks</span> <span class='hs-varid'>xs</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mconcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-64"></a>	<span class='hs-conid'>EOF</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EOF</span>
<a name="line-65"></a>
<a name="line-66"></a><a name="instance%20Monoid%20(Stream%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-67"></a>	<span class='hs-varid'>mempty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Chunks</span> <span class='hs-varid'>mempty</span>
<a name="line-68"></a>	<span class='hs-varid'>mappend</span> <span class='hs-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Chunks</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span> <span class='hs-varop'>++</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span>
<a name="line-69"></a>	<span class='hs-varid'>mappend</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EOF</span>
<a name="line-70"></a>
<a name="line-71"></a><a name="Step"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-72"></a>	<span class='hs-comment'>-- | The 'Iteratee' is capable of accepting more input. Note that more input</span>
<a name="line-73"></a>	<span class='hs-comment'>-- is not necessarily required; the 'Iteratee' might be able to generate a</span>
<a name="line-74"></a>	<span class='hs-comment'>-- value immediately if it receives 'EOF'.</span>
<a name="line-75"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>Continue</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-76"></a>	
<a name="line-77"></a>	<span class='hs-comment'>-- | The 'Iteratee' cannot receive any more input, and has generated a</span>
<a name="line-78"></a>	<span class='hs-comment'>-- result. Included in this value is left-over input, which can be passed to</span>
<a name="line-79"></a>	<span class='hs-comment'>-- composed 'Iteratee's.</span>
<a name="line-80"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>Yield</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-81"></a>	
<a name="line-82"></a>	<span class='hs-comment'>-- | The 'Iteratee' encountered an error which prevents it from proceeding</span>
<a name="line-83"></a>	<span class='hs-comment'>-- further.</span>
<a name="line-84"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-conid'>Error</span> <span class='hs-conid'>Exc</span><span class='hs-varop'>.</span><span class='hs-conid'>SomeException</span>
<a name="line-85"></a>
<a name="line-86"></a><span class='hs-comment'>-- | The primary data type for this library; an iteratee consumes</span>
<a name="line-87"></a><span class='hs-comment'>-- chunks of input from a stream until it either yields a value or</span>
<a name="line-88"></a><span class='hs-comment'>-- encounters an error.</span>
<a name="line-89"></a><span class='hs-comment'>--</span>
<a name="line-90"></a><span class='hs-comment'>-- Compatibility note: @Iteratee@ will become abstract in @enumerator_0.5@. If</span>
<a name="line-91"></a><span class='hs-comment'>-- you depend on internal implementation details, please import</span>
<a name="line-92"></a><span class='hs-comment'>-- @"Data.Enumerator.Internal"@.</span>
<a name="line-93"></a>
<a name="line-94"></a><a name="Iteratee"></a><span class='hs-comment'>-- In general, iteratees begin in the 'Continue' state. As each chunk is</span>
<a name="line-95"></a><a name="Iteratee"></a><span class='hs-comment'>-- passed to the continuation, the iteratee returns the next step:</span>
<a name="line-96"></a><a name="Iteratee"></a><span class='hs-comment'>-- 'Continue' for more data, 'Yield' when it's finished, or 'Error' to</span>
<a name="line-97"></a><a name="Iteratee"></a><span class='hs-comment'>-- abort processing.</span>
<a name="line-98"></a><a name="Iteratee"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span>
<a name="line-99"></a>	<span class='hs-layout'>{</span> <span class='hs-varid'>runIteratee</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-100"></a>	<span class='hs-layout'>}</span>
<a name="line-101"></a>
<a name="line-102"></a><a name="instance%20Monad%20(Iteratee%20a%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-103"></a>	<span class='hs-varid'>return</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>yield</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-104"></a>
<a name="line-105"></a>	<span class='hs-varid'>m0</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>$</span> <span class='hs-varid'>m0</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fix</span> <span class='hs-varop'>$</span>
<a name="line-106"></a>		<span class='hs-keyglyph'>\</span><span class='hs-varid'>bind</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varop'>$</span> <span class='hs-varid'>runIteratee</span> <span class='hs-varid'>m</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r1</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-107"></a>			<span class='hs-keyword'>case</span> <span class='hs-varid'>r1</span> <span class='hs-keyword'>of</span>
<a name="line-108"></a>				<span class='hs-conid'>Continue</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Continue</span> <span class='hs-layout'>(</span><span class='hs-varid'>bind</span> <span class='hs-varop'>.</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-109"></a>				<span class='hs-conid'>Error</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Error</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-110"></a>				<span class='hs-conid'>Yield</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>runIteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-111"></a>				<span class='hs-conid'>Yield</span> <span class='hs-varid'>x</span> <span class='hs-varid'>extra</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>runIteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r2</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-112"></a>					<span class='hs-keyword'>case</span> <span class='hs-varid'>r2</span> <span class='hs-keyword'>of</span>
<a name="line-113"></a>						<span class='hs-conid'>Continue</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>runIteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-varid'>extra</span><span class='hs-layout'>)</span>
<a name="line-114"></a>						<span class='hs-conid'>Error</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Error</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-115"></a>						<span class='hs-conid'>Yield</span> <span class='hs-varid'>x'</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Yield</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>extra</span><span class='hs-layout'>)</span>
<a name="line-116"></a>
<a name="line-117"></a><a name="instance%20MonadTrans%20(Iteratee%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadTrans</span> <span class='hs-layout'>(</span><span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-118"></a>	<span class='hs-varid'>lift</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>runIteratee</span> <span class='hs-varop'>.</span> <span class='hs-varid'>return</span><span class='hs-layout'>)</span>
<a name="line-119"></a>
<a name="line-120"></a><a name="instance%20MonadIO%20(Iteratee%20a%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadIO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-121"></a>	<span class='hs-varid'>liftIO</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lift</span> <span class='hs-varop'>.</span> <span class='hs-varid'>liftIO</span>
<a name="line-122"></a>
<a name="line-123"></a><span class='hs-comment'>-- | Enumerators are sources of data, to be consumed by iteratees.</span>
<a name="line-124"></a><span class='hs-comment'>-- Enumerators typically read from an external source (parser, handle,</span>
<a name="line-125"></a><span class='hs-comment'>-- random generator, etc), then feed chunks into an tteratee until:</span>
<a name="line-126"></a><span class='hs-comment'>--</span>
<a name="line-127"></a><span class='hs-comment'>-- * The input source runs out of data.</span>
<a name="line-128"></a><span class='hs-comment'>--</span>
<a name="line-129"></a><span class='hs-comment'>-- * The iteratee yields a result value.</span>
<a name="line-130"></a><span class='hs-comment'>--</span>
<a name="line-131"></a><span class='hs-comment'>-- * The iteratee throws an exception.</span>
<a name="line-132"></a>
<a name="line-133"></a><a name="Enumerator"></a><span class='hs-comment'>-- Since @'Iteratee'@ is an alias for @m ('Step' a m b)@, 'Enumerator's can</span>
<a name="line-134"></a><a name="Enumerator"></a><span class='hs-comment'>-- be considered step transformers of type @'Step' a m b -&gt; m ('Step' a m b)@.</span>
<a name="line-135"></a><a name="Enumerator"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Enumerator</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-136"></a>
<a name="line-137"></a><a name="Enumeratee"></a><span class='hs-comment'>-- | An enumeratee acts as a stream adapter; place one between an enumerator</span>
<a name="line-138"></a><a name="Enumeratee"></a><span class='hs-comment'>-- and an iteratee, and it changes the type or contents of the input stream.</span>
<a name="line-139"></a><a name="Enumeratee"></a><span class='hs-comment'>--</span>
<a name="line-140"></a><a name="Enumeratee"></a><span class='hs-comment'>-- Most users will want to combine enumerators, enumeratees, and iteratees</span>
<a name="line-141"></a><a name="Enumeratee"></a><span class='hs-comment'>-- using the stream combinators @joinI@ and @joinE@, or their operator aliases</span>
<a name="line-142"></a><a name="Enumeratee"></a><span class='hs-comment'>-- @(=$)@ and @($=)@. These combinators are used to manage how left-over input</span>
<a name="line-143"></a><a name="Enumeratee"></a><span class='hs-comment'>-- is passed between elements of the data processing pipeline.</span>
<a name="line-144"></a><a name="Enumeratee"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Enumeratee</span> <span class='hs-varid'>ao</span> <span class='hs-varid'>ai</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Step</span> <span class='hs-varid'>ai</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>ao</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>ai</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-145"></a>
<a name="line-146"></a><a name="instance%20Typeable1%20Stream"></a><span class='hs-comment'>-- | Since: 0.4.8</span>
<a name="line-147"></a><a name="instance%20Typeable1%20Stream"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Typeable1</span> <span class='hs-conid'>Stream</span> <span class='hs-keyword'>where</span>
<a name="line-148"></a>	<span class='hs-varid'>typeOf1</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTyConApp</span> <span class='hs-varid'>tyCon</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>where</span>
<a name="line-149"></a>		<span class='hs-varid'>tyCon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTyCon</span> <span class='hs-str'>"Data.Enumerator.Stream"</span>
<a name="line-150"></a>
<a name="line-151"></a><a name="instance%20Typeable1%20(Iteratee%20a%20m)"></a><span class='hs-comment'>-- | Since: 0.4.6</span>
<a name="line-152"></a><a name="instance%20Typeable1%20(Iteratee%20a%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable1</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-153"></a>	<span class='hs-conid'>Typeable1</span> <span class='hs-layout'>(</span><span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-154"></a>		<span class='hs-varid'>typeOf1</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span>
<a name="line-155"></a>			<span class='hs-varid'>tyCon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTyCon</span> <span class='hs-str'>"Data.Enumerator.Iteratee"</span>
<a name="line-156"></a>			<span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>peel</span> <span class='hs-varid'>i</span>
<a name="line-157"></a>			
<a name="line-158"></a>			<span class='hs-varid'>peel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-159"></a>			<span class='hs-varid'>peel</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>undefined</span>
<a name="line-160"></a>			
<a name="line-161"></a>			<span class='hs-keyword'>in</span> <span class='hs-varid'>mkTyConApp</span> <span class='hs-varid'>tyCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>typeOf</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeOf1</span> <span class='hs-varid'>m</span><span class='hs-keyglyph'>]</span>
<a name="line-162"></a>
<a name="line-163"></a><a name="instance%20Typeable1%20(Step%20a%20m)"></a><span class='hs-comment'>-- | Since: 0.4.8</span>
<a name="line-164"></a><a name="instance%20Typeable1%20(Step%20a%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable1</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-165"></a>	<span class='hs-conid'>Typeable1</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-166"></a>		<span class='hs-varid'>typeOf1</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span>
<a name="line-167"></a>			<span class='hs-varid'>tyCon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTyCon</span> <span class='hs-str'>"Data.Enumerator.Step"</span>
<a name="line-168"></a>			<span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>peel</span> <span class='hs-varid'>s</span>
<a name="line-169"></a>			
<a name="line-170"></a>			<span class='hs-varid'>peel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-171"></a>			<span class='hs-varid'>peel</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>undefined</span>
<a name="line-172"></a>			
<a name="line-173"></a>			<span class='hs-keyword'>in</span> <span class='hs-varid'>mkTyConApp</span> <span class='hs-varid'>tyCon</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>typeOf</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeOf1</span> <span class='hs-varid'>m</span><span class='hs-keyglyph'>]</span>
<a name="line-174"></a>
<a name="line-175"></a><a name="instance%20Functor%20(Iteratee%20a%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-176"></a>	<span class='hs-varid'>fmap</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CM</span><span class='hs-varop'>.</span><span class='hs-varid'>liftM</span>
<a name="line-177"></a>
<a name="line-178"></a><a name="instance%20A.Applicative%20(Iteratee%20a%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-179"></a>	<span class='hs-varid'>pure</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span>
<a name="line-180"></a>	<span class='hs-layout'>(</span><span class='hs-varop'>&lt;*&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CM</span><span class='hs-varop'>.</span><span class='hs-varid'>ap</span>
<a name="line-181"></a>
<a name="line-182"></a><a name="instance%20Functor%20Stream"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-conid'>Stream</span> <span class='hs-keyword'>where</span>
<a name="line-183"></a>	<span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Chunks</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-184"></a>	<span class='hs-varid'>fmap</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>EOF</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EOF</span>
<a name="line-185"></a>
<a name="line-186"></a><a name="instance%20A.Applicative%20Stream"></a><span class='hs-comment'>-- | Since: 0.4.5</span>
<a name="line-187"></a><a name="instance%20A.Applicative%20Stream"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span> <span class='hs-conid'>Stream</span> <span class='hs-keyword'>where</span>
<a name="line-188"></a>	<span class='hs-varid'>pure</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span>
<a name="line-189"></a>	<span class='hs-layout'>(</span><span class='hs-varop'>&lt;*&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CM</span><span class='hs-varop'>.</span><span class='hs-varid'>ap</span>
<a name="line-190"></a>
<a name="line-191"></a><a name="returnI"></a><span class='hs-comment'>-- | @'returnI' step = 'Iteratee' (return step)@</span>
<a name="line-192"></a><span class='hs-definition'>returnI</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-193"></a><span class='hs-definition'>returnI</span> <span class='hs-varid'>step</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varid'>step</span><span class='hs-layout'>)</span>
<a name="line-194"></a>
<a name="line-195"></a><a name="yield"></a><span class='hs-comment'>-- | @'yield' x extra = 'returnI' ('Yield' x extra)@</span>
<a name="line-196"></a><span class='hs-comment'>--</span>
<a name="line-197"></a><span class='hs-comment'>-- WARNING: due to the current encoding of iteratees in this library,</span>
<a name="line-198"></a><span class='hs-comment'>-- careless use of the 'yield' primitive may violate the monad laws.</span>
<a name="line-199"></a><span class='hs-comment'>-- To prevent this, always make sure that an iteratee never yields</span>
<a name="line-200"></a><span class='hs-comment'>-- extra data unless it has received at least one input element.</span>
<a name="line-201"></a><span class='hs-comment'>--</span>
<a name="line-202"></a><span class='hs-comment'>-- More strictly, iteratees may not yield data that they did not</span>
<a name="line-203"></a><span class='hs-comment'>-- receive as input. Don't use 'yield' to &amp;#x201c;inject&amp;#x201d; elements</span>
<a name="line-204"></a><span class='hs-comment'>-- into the stream.</span>
<a name="line-205"></a><span class='hs-definition'>yield</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-206"></a><span class='hs-definition'>yield</span> <span class='hs-varid'>x</span> <span class='hs-varid'>extra</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>returnI</span> <span class='hs-layout'>(</span><span class='hs-conid'>Yield</span> <span class='hs-varid'>x</span> <span class='hs-varid'>extra</span><span class='hs-layout'>)</span>
<a name="line-207"></a>
<a name="line-208"></a><a name="continue"></a><span class='hs-comment'>-- | @'continue' k = 'returnI' ('Continue' k)@</span>
<a name="line-209"></a><span class='hs-definition'>continue</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-210"></a><span class='hs-definition'>continue</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>returnI</span> <span class='hs-layout'>(</span><span class='hs-conid'>Continue</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-211"></a>
<a name="line-212"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>1</span> <span class='hs-varop'>&gt;&gt;==</span>
<a name="line-213"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>1</span> <span class='hs-varop'>==&lt;&lt;</span>
<a name="line-214"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>0</span> <span class='hs-varop'>$$</span>
<a name="line-215"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>1</span> <span class='hs-varop'>&gt;==&gt;</span>
<a name="line-216"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>1</span> <span class='hs-varop'>&lt;==&lt;</span>
<a name="line-217"></a>
<a name="line-218"></a><a name="%3e%3e=="></a><span class='hs-comment'>-- | The most primitive stream operator. @iter &gt;&gt;== enum@ returns a new</span>
<a name="line-219"></a><span class='hs-comment'>-- iteratee which will read from @enum@ before continuing.</span>
<a name="line-220"></a><span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;==</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-221"></a>       <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-222"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span><span class='hs-layout'>)</span>
<a name="line-223"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span>
<a name="line-224"></a><a name="i"></a><span class='hs-definition'>i</span> <span class='hs-varop'>&gt;&gt;==</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>runIteratee</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>runIteratee</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-225"></a>
<a name="line-226"></a><a name="==%3c%3c"></a><span class='hs-comment'>-- | @('==&lt;&lt;') = flip ('&gt;&gt;==')@</span>
<a name="line-227"></a><span class='hs-layout'>(</span><span class='hs-varop'>==&lt;&lt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-228"></a>       <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span><span class='hs-layout'>)</span>
<a name="line-229"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-230"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span>
<a name="line-231"></a><span class='hs-layout'>(</span><span class='hs-varop'>==&lt;&lt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flip</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;&gt;==</span><span class='hs-layout'>)</span>
<a name="line-232"></a>
<a name="line-233"></a><a name="$$"></a><span class='hs-comment'>-- | @('$$') = ('==&lt;&lt;')@</span>
<a name="line-234"></a><span class='hs-comment'>--</span>
<a name="line-235"></a><span class='hs-comment'>-- This is somewhat easier to read when constructing an iteratee from many</span>
<a name="line-236"></a><span class='hs-comment'>-- processing stages. You can treat it like @('$')@, and read the data flow</span>
<a name="line-237"></a><span class='hs-comment'>-- from left to right.</span>
<a name="line-238"></a><span class='hs-comment'>--</span>
<a name="line-239"></a><span class='hs-comment'>-- Since: 0.1.1</span>
<a name="line-240"></a><span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-241"></a>     <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span><span class='hs-layout'>)</span>
<a name="line-242"></a>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-243"></a>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span>
<a name="line-244"></a><span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>==&lt;&lt;</span><span class='hs-layout'>)</span>
<a name="line-245"></a>
<a name="line-246"></a><a name="%3e==%3e"></a><span class='hs-comment'>-- | @('&gt;==&gt;') enum1 enum2 step = enum1 step '&gt;&gt;==' enum2@</span>
<a name="line-247"></a><span class='hs-comment'>--</span>
<a name="line-248"></a><span class='hs-comment'>-- The moral equivalent of @('CM.&gt;=&gt;')@ for iteratees.</span>
<a name="line-249"></a><span class='hs-comment'>--</span>
<a name="line-250"></a><span class='hs-comment'>-- Since: 0.1.1</span>
<a name="line-251"></a><span class='hs-layout'>(</span><span class='hs-varop'>&gt;==&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-252"></a>       <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Enumerator</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-253"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span><span class='hs-layout'>)</span>
<a name="line-254"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-255"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span>
<a name="line-256"></a><span class='hs-layout'>(</span><span class='hs-varop'>&gt;==&gt;</span><span class='hs-layout'>)</span> <span class='hs-varid'>e1</span> <span class='hs-varid'>e2</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>e1</span> <span class='hs-varid'>s</span> <span class='hs-varop'>&gt;&gt;==</span> <span class='hs-varid'>e2</span>
<a name="line-257"></a>
<a name="line-258"></a><a name="%3c==%3c"></a><span class='hs-comment'>-- | @('&lt;==&lt;') = flip ('&gt;==&gt;')@</span>
<a name="line-259"></a><span class='hs-comment'>--</span>
<a name="line-260"></a><span class='hs-comment'>-- Since: 0.1.1</span>
<a name="line-261"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;==&lt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-262"></a>       <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span><span class='hs-layout'>)</span>
<a name="line-263"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Enumerator</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-264"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-265"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b'</span>
<a name="line-266"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;==&lt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flip</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;==&gt;</span><span class='hs-layout'>)</span>
<a name="line-267"></a>
<a name="line-268"></a><a name="enumEOF"></a><span class='hs-comment'>-- | Sends 'EOF' to its iteratee. Most clients should use 'run' or 'run_'</span>
<a name="line-269"></a><span class='hs-comment'>-- instead.</span>
<a name="line-270"></a><span class='hs-definition'>enumEOF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Enumerator</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-271"></a><span class='hs-definition'>enumEOF</span> <span class='hs-layout'>(</span><span class='hs-conid'>Yield</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>yield</span> <span class='hs-varid'>x</span> <span class='hs-conid'>EOF</span>
<a name="line-272"></a><span class='hs-definition'>enumEOF</span> <span class='hs-layout'>(</span><span class='hs-conid'>Error</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>returnI</span> <span class='hs-layout'>(</span><span class='hs-conid'>Error</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-273"></a><span class='hs-definition'>enumEOF</span> <span class='hs-layout'>(</span><span class='hs-conid'>Continue</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-conid'>EOF</span> <span class='hs-varop'>&gt;&gt;==</span> <span class='hs-varid'>check</span> <span class='hs-keyword'>where</span>
<a name="line-274"></a>	<span class='hs-varid'>check</span> <span class='hs-layout'>(</span><span class='hs-conid'>Continue</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"enumEOF: divergent iteratee"</span>
<a name="line-275"></a>	<span class='hs-varid'>check</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>enumEOF</span> <span class='hs-varid'>s</span>
<a name="line-276"></a>
<a name="line-277"></a><a name="checkDoneEx"></a><span class='hs-comment'>-- | A common pattern in 'Enumeratee' implementations is to check whether</span>
<a name="line-278"></a><span class='hs-comment'>-- the inner 'Iteratee' has finished, and if so, to return its output.</span>
<a name="line-279"></a><span class='hs-comment'>-- 'checkDone' passes its parameter a continuation if the 'Iteratee'</span>
<a name="line-280"></a><span class='hs-comment'>-- can still consume input, or yields otherwise.</span>
<a name="line-281"></a><span class='hs-comment'>--</span>
<a name="line-282"></a><span class='hs-comment'>-- Since: 0.4.3</span>
<a name="line-283"></a><span class='hs-definition'>checkDoneEx</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-284"></a>	<span class='hs-conid'>Stream</span> <span class='hs-varid'>a'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-285"></a>	<span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-286"></a>	<span class='hs-conid'>Enumeratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-287"></a><span class='hs-definition'>checkDoneEx</span> <span class='hs-keyword'>_</span>     <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Continue</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>k</span>
<a name="line-288"></a><span class='hs-definition'>checkDoneEx</span> <span class='hs-varid'>extra</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>step</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>yield</span> <span class='hs-varid'>step</span> <span class='hs-varid'>extra</span>
<a name="line-289"></a>
<a name="line-290"></a><a name="checkDone"></a><span class='hs-comment'>-- | @'checkDone' = 'checkDoneEx' ('Chunks' [])@</span>
<a name="line-291"></a><span class='hs-comment'>--</span>
<a name="line-292"></a><span class='hs-comment'>-- Use this for enumeratees which do not have an input buffer.</span>
<a name="line-293"></a><span class='hs-definition'>checkDone</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-294"></a>	<span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-295"></a>	<span class='hs-conid'>Enumeratee</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-296"></a><span class='hs-definition'>checkDone</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>checkDoneEx</span> <span class='hs-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-297"></a>
<a name="line-298"></a><a name="checkContinue0"></a><span class='hs-comment'>-- | A common pattern in 'Enumerator' implementations is to check whether</span>
<a name="line-299"></a><span class='hs-comment'>-- the inner 'Iteratee' has finished, and if so, to return its output.</span>
<a name="line-300"></a><span class='hs-comment'>-- 'checkContinue0' passes its parameter a continuation if the 'Iteratee'</span>
<a name="line-301"></a><span class='hs-comment'>-- can still consume input; if not, it returns the iteratee's step.</span>
<a name="line-302"></a><span class='hs-comment'>--</span>
<a name="line-303"></a><span class='hs-comment'>-- The type signature here is a bit crazy, but it's actually very easy to</span>
<a name="line-304"></a><span class='hs-comment'>-- use. Take this code:</span>
<a name="line-305"></a><span class='hs-comment'>--</span>
<a name="line-306"></a><span class='hs-comment'>-- &gt; repeat :: Monad m =&gt; a -&gt; Enumerator a m b</span>
<a name="line-307"></a><span class='hs-comment'>-- &gt; repeat x = loop where</span>
<a name="line-308"></a><span class='hs-comment'>-- &gt; 	loop (Continue k) = k (Chunks [x]) &gt;&gt;== loop</span>
<a name="line-309"></a><span class='hs-comment'>-- &gt; 	loop step = returnI step</span>
<a name="line-310"></a><span class='hs-comment'>--</span>
<a name="line-311"></a><span class='hs-comment'>-- And rewrite it without the boilerplate:</span>
<a name="line-312"></a><span class='hs-comment'>--</span>
<a name="line-313"></a><span class='hs-comment'>-- &gt; repeat :: Monad m =&gt; a -&gt; Enumerator a m b</span>
<a name="line-314"></a><span class='hs-comment'>-- &gt; repeat x = checkContinue0 $ \loop k -&gt; k (Chunks [x] &gt;&gt;== loop</span>
<a name="line-315"></a><span class='hs-comment'>--</span>
<a name="line-316"></a><span class='hs-comment'>-- Since: 0.4.9</span>
<a name="line-317"></a><span class='hs-definition'>checkContinue0</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-318"></a>               <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Enumerator</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-319"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-320"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-321"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Enumerator</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-322"></a><span class='hs-definition'>checkContinue0</span> <span class='hs-varid'>inner</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-keyword'>where</span>
<a name="line-323"></a>	<span class='hs-varid'>loop</span> <span class='hs-layout'>(</span><span class='hs-conid'>Continue</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inner</span> <span class='hs-varid'>loop</span> <span class='hs-varid'>k</span>
<a name="line-324"></a>	<span class='hs-varid'>loop</span> <span class='hs-varid'>step</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>returnI</span> <span class='hs-varid'>step</span>
<a name="line-325"></a>
<a name="line-326"></a>
<a name="line-327"></a><a name="checkContinue1"></a><span class='hs-comment'>-- | Like 'checkContinue0', but allows each loop step to use a state value:</span>
<a name="line-328"></a><span class='hs-comment'>--</span>
<a name="line-329"></a><span class='hs-comment'>-- &gt; iterate :: Monad m =&gt; (a -&gt; a) -&gt; a -&gt; Enumerator a m b</span>
<a name="line-330"></a><span class='hs-comment'>-- &gt; iterate f = checkContinue1 $ \loop a k -&gt; k (Chunks [a]) &gt;&gt;== loop (f a)</span>
<a name="line-331"></a><span class='hs-comment'>--</span>
<a name="line-332"></a><span class='hs-comment'>-- Since: 0.4.9</span>
<a name="line-333"></a><span class='hs-definition'>checkContinue1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-334"></a>               <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>s1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Enumerator</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-335"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s1</span>
<a name="line-336"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Stream</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-337"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-338"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s1</span>
<a name="line-339"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Enumerator</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-340"></a><span class='hs-definition'>checkContinue1</span> <span class='hs-varid'>inner</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-keyword'>where</span>
<a name="line-341"></a>	<span class='hs-varid'>loop</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-conid'>Continue</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inner</span> <span class='hs-varid'>loop</span> <span class='hs-varid'>s</span> <span class='hs-varid'>k</span>
<a name="line-342"></a>	<span class='hs-varid'>loop</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>step</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>returnI</span> <span class='hs-varid'>step</span>
</pre></body>
</html>