This file is indexed.

/usr/share/doc/libghc-enumerator-doc/html/src/Data-Enumerator.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
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
<?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.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</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'>-- For compatibility reasons, this module should imported qualified:</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- @</span>
<a name="line-12"></a><span class='hs-comment'>-- import qualified Data.Enumerator as E</span>
<a name="line-13"></a><span class='hs-comment'>-- @</span>
<a name="line-14"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Enumerator</span>
<a name="line-15"></a>	<span class='hs-layout'>(</span>
<a name="line-16"></a>	
<a name="line-17"></a>	<span class='hs-comment'>-- * Types</span>
<a name="line-18"></a>	  <span class='hs-conid'>Iteratee</span>
<a name="line-19"></a>	<span class='hs-layout'>,</span> <span class='hs-conid'>Enumerator</span>
<a name="line-20"></a>	<span class='hs-layout'>,</span> <span class='hs-conid'>Enumeratee</span>
<a name="line-21"></a>	
<a name="line-22"></a>	<span class='hs-comment'>-- * Running iteratees</span>
<a name="line-23"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>run</span>
<a name="line-24"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>run_</span>
<a name="line-25"></a>	
<a name="line-26"></a>	<span class='hs-comment'>-- * Operators</span>
<a name="line-27"></a>	<span class='hs-comment'>-- | Compatibility note: Most of these will be obsoleted by</span>
<a name="line-28"></a>	<span class='hs-comment'>-- version 0.5. Please make sure your @.cabal@ files have a</span>
<a name="line-29"></a>	<span class='hs-comment'>-- @&lt;0.5@ limit on the @enumerator@ dependency.</span>
<a name="line-30"></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-31"></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-32"></a>	<span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>$$</span><span class='hs-layout'>)</span>
<a name="line-33"></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-34"></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-35"></a>	<span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>=$</span><span class='hs-layout'>)</span>
<a name="line-36"></a>	<span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>$=</span><span class='hs-layout'>)</span>
<a name="line-37"></a>	<span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>=$=</span><span class='hs-layout'>)</span>
<a name="line-38"></a>	
<a name="line-39"></a>	<span class='hs-comment'>-- * Error handling</span>
<a name="line-40"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>throwError</span>
<a name="line-41"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>catchError</span>
<a name="line-42"></a>	
<a name="line-43"></a>	<span class='hs-comment'>-- * Miscellaneous</span>
<a name="line-44"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>concatEnums</span>
<a name="line-45"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>joinI</span>
<a name="line-46"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>joinE</span>
<a name="line-47"></a>	<span class='hs-layout'>,</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-varid'>sequence</span>
<a name="line-48"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>isEOF</span>
<a name="line-49"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>tryIO</span>
<a name="line-50"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>liftTrans</span>
<a name="line-51"></a>	
<a name="line-52"></a>	<span class='hs-comment'>-- * Testing and debugging</span>
<a name="line-53"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>printChunks</span>
<a name="line-54"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>enumList</span>
<a name="line-55"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>enumLists</span>
<a name="line-56"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>runLists</span>
<a name="line-57"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>runLists_</span>
<a name="line-58"></a>	
<a name="line-59"></a>	<span class='hs-comment'>-- * Internal interfaces</span>
<a name="line-60"></a>	<span class='hs-comment'>-- | This module export will be removed in version 0.5. If you</span>
<a name="line-61"></a>	<span class='hs-comment'>-- depend on internal implementation details, please import</span>
<a name="line-62"></a>	<span class='hs-comment'>-- @"Data.Enumerator.Internal"@ directly.</span>
<a name="line-63"></a>	<span class='hs-layout'>,</span> <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-64"></a>	
<a name="line-65"></a>	<span class='hs-comment'>-- Obsolete and pointless</span>
<a name="line-66"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>peek</span>
<a name="line-67"></a>	<span class='hs-layout'>,</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-varid'>last</span>
<a name="line-68"></a>	<span class='hs-layout'>,</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-varid'>length</span>
<a name="line-69"></a>	
<a name="line-70"></a>	<span class='hs-comment'>-- Legacy compatibility</span>
<a name="line-71"></a>	<span class='hs-comment'>-- These legacy compatibility functions will be removed in</span>
<a name="line-72"></a>	<span class='hs-comment'>-- version 0.5.</span>
<a name="line-73"></a>	<span class='hs-layout'>,</span> <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'>Compatibility</span>
<a name="line-74"></a>	<span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-75"></a>
<a name="line-76"></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-77"></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-78"></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-79"></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-80"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Functor</span><span class='hs-varop'>.</span><span class='hs-conid'>Identity</span> <span class='hs-layout'>(</span><span class='hs-conid'>Identity</span><span class='hs-layout'>,</span> <span class='hs-varid'>runIdentity</span><span class='hs-layout'>)</span>
<a name="line-81"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-layout'>(</span><span class='hs-varid'>genericLength</span><span class='hs-layout'>,</span> <span class='hs-varid'>genericSplitAt</span><span class='hs-layout'>)</span>
<a name="line-82"></a>
<a name="line-83"></a><span class='hs-keyword'>import</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'>Compatibility</span>
<a name="line-84"></a><span class='hs-keyword'>import</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-85"></a>
<a name="line-86"></a><a name="run"></a><span class='hs-comment'>-- | Run an iteratee until it finishes, and return either the final value</span>
<a name="line-87"></a><span class='hs-comment'>-- (if it succeeded) or the error (if it failed).</span>
<a name="line-88"></a><span class='hs-comment'>--</span>
<a name="line-89"></a><span class='hs-comment'>-- &gt; import Data.Enumerator</span>
<a name="line-90"></a><span class='hs-comment'>-- &gt; import Data.Enumerator.List as EL</span>
<a name="line-91"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-92"></a><span class='hs-comment'>-- &gt; main = do</span>
<a name="line-93"></a><span class='hs-comment'>-- &gt;     result &lt;- run (EL.iterate succ 'A' $$ EL.take 5)</span>
<a name="line-94"></a><span class='hs-comment'>-- &gt;     case result of</span>
<a name="line-95"></a><span class='hs-comment'>-- &gt;         Left exc -&gt; putStrLn ("Got an exception: " ++ show exc)</span>
<a name="line-96"></a><span class='hs-comment'>-- &gt;         Right chars -&gt; putStrLn ("Got characters: " ++ show chars)</span>
<a name="line-97"></a><span class='hs-definition'>run</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'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-98"></a>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>Exc</span><span class='hs-varop'>.</span><span class='hs-conid'>SomeException</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-99"></a><span class='hs-definition'>run</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-100"></a>	<span class='hs-varid'>mStep</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runIteratee</span> <span class='hs-varop'>$</span> <span class='hs-varid'>enumEOF</span> <span class='hs-varop'>==&lt;&lt;</span> <span class='hs-varid'>i</span>
<a name="line-101"></a>	<span class='hs-keyword'>case</span> <span class='hs-varid'>mStep</span> <span class='hs-keyword'>of</span>
<a name="line-102"></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-varop'>$</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span>
<a name="line-103"></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-varop'>$</span> <span class='hs-conid'>Right</span> <span class='hs-varid'>x</span>
<a name="line-104"></a>		<span class='hs-conid'>Continue</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-str'>"run: divergent iteratee"</span>
<a name="line-105"></a>
<a name="line-106"></a><a name="run_"></a><span class='hs-comment'>-- | Like 'run', except errors are converted to exceptions and thrown.</span>
<a name="line-107"></a><span class='hs-comment'>-- Primarily useful for small scripts or other simple cases.</span>
<a name="line-108"></a><span class='hs-comment'>--</span>
<a name="line-109"></a><span class='hs-comment'>-- &gt; import Data.Enumerator</span>
<a name="line-110"></a><span class='hs-comment'>-- &gt; import Data.Enumerator.List as EL</span>
<a name="line-111"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-112"></a><span class='hs-comment'>-- &gt; main = do</span>
<a name="line-113"></a><span class='hs-comment'>-- &gt;     chars &lt;- run_ (EL.iterate succ 'A' $$ EL.take 5)</span>
<a name="line-114"></a><span class='hs-comment'>-- &gt;     putStrLn ("Got characters: " ++ show chars)</span>
<a name="line-115"></a><span class='hs-comment'>--</span>
<a name="line-116"></a><span class='hs-comment'>-- Since: 0.4.1</span>
<a name="line-117"></a><span class='hs-definition'>run_</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'>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-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-118"></a><span class='hs-definition'>run_</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>run</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>either</span> <span class='hs-conid'>Exc</span><span class='hs-varop'>.</span><span class='hs-varid'>throw</span> <span class='hs-varid'>return</span>
<a name="line-119"></a>
<a name="line-120"></a><a name="throwError"></a><span class='hs-comment'>-- | The moral equivalent of 'Exc.throwIO' for iteratees.</span>
<a name="line-121"></a><span class='hs-definition'>throwError</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>Exc</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>e</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-122"></a><span class='hs-definition'>throwError</span> <span class='hs-varid'>exc</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-layout'>(</span><span class='hs-conid'>Exc</span><span class='hs-varop'>.</span><span class='hs-varid'>toException</span> <span class='hs-varid'>exc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-123"></a>
<a name="line-124"></a><a name="catchError"></a><span class='hs-comment'>-- | Runs the iteratee, and calls an exception handler if an 'Error' is</span>
<a name="line-125"></a><span class='hs-comment'>-- returned. By handling errors within the enumerator library, and requiring</span>
<a name="line-126"></a><span class='hs-comment'>-- all errors to be represented by 'Exc.SomeException', libraries with</span>
<a name="line-127"></a><span class='hs-comment'>-- varying error types can be easily composed.</span>
<a name="line-128"></a><span class='hs-comment'>--</span>
<a name="line-129"></a><span class='hs-comment'>-- WARNING: Within the error handler, it is difficult or impossible to know</span>
<a name="line-130"></a><span class='hs-comment'>-- how much input the original iteratee has consumed. Users are strongly</span>
<a name="line-131"></a><span class='hs-comment'>-- advised to wrap all uses of @catchError@ with an appropriate isolation</span>
<a name="line-132"></a><span class='hs-comment'>-- enumeratee, such as @Data.Enumerator.List.isolate@ or</span>
<a name="line-133"></a><span class='hs-comment'>-- @Data.Enumerator.Binary.isolate@, which will handle input framing even</span>
<a name="line-134"></a><span class='hs-comment'>-- in the face of unexpected errors.</span>
<a name="line-135"></a><span class='hs-comment'>--</span>
<a name="line-136"></a><span class='hs-comment'>-- Since: 0.1.1</span>
<a name="line-137"></a><span class='hs-definition'>catchError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-138"></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-139"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Exc</span><span class='hs-varop'>.</span><span class='hs-conid'>SomeException</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-140"></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-141"></a><span class='hs-definition'>catchError</span> <span class='hs-varid'>i</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-keyword'>where</span>
<a name="line-142"></a>	<span class='hs-varid'>go</span> <span class='hs-varid'>iter</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-143"></a>		<span class='hs-varid'>step</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runIteratee</span> <span class='hs-varid'>iter</span>
<a name="line-144"></a>		<span class='hs-keyword'>case</span> <span class='hs-varid'>step</span> <span class='hs-keyword'>of</span>
<a name="line-145"></a>			<span class='hs-conid'>Yield</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>step</span>
<a name="line-146"></a>			<span class='hs-conid'>Error</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>runIteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>h</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-147"></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'>wrap</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-148"></a>	
<a name="line-149"></a>	<span class='hs-varid'>wrap</span> <span class='hs-varid'>k</span> <span class='hs-conid'>EOF</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-150"></a>		<span class='hs-varid'>res</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>run</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-conid'>EOF</span><span class='hs-layout'>)</span>
<a name="line-151"></a>		<span class='hs-keyword'>case</span> <span class='hs-varid'>res</span> <span class='hs-keyword'>of</span>
<a name="line-152"></a>			<span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>runIteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>enumEOF</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>h</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-153"></a>			<span class='hs-conid'>Right</span> <span class='hs-varid'>b</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'>b</span> <span class='hs-conid'>EOF</span><span class='hs-layout'>)</span>
<a name="line-154"></a>	
<a name="line-155"></a>	<span class='hs-varid'>wrap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>stream</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-156"></a>		<span class='hs-varid'>step</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runIteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-varid'>stream</span><span class='hs-layout'>)</span>
<a name="line-157"></a>		<span class='hs-keyword'>case</span> <span class='hs-varid'>step</span> <span class='hs-keyword'>of</span>
<a name="line-158"></a>			<span class='hs-conid'>Yield</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>step</span>
<a name="line-159"></a>			<span class='hs-conid'>Error</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-160"></a>				<span class='hs-varid'>step'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runIteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>h</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-161"></a>				<span class='hs-keyword'>case</span> <span class='hs-varid'>step'</span> <span class='hs-keyword'>of</span>
<a name="line-162"></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'>stream</span><span class='hs-layout'>)</span>
<a name="line-163"></a>					<span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>step'</span>
<a name="line-164"></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'>wrap</span> <span class='hs-varid'>k'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-165"></a>
<a name="line-166"></a><a name="printChunks"></a><span class='hs-comment'>-- | Print chunks as they're received from the enumerator, optionally</span>
<a name="line-167"></a><span class='hs-comment'>-- printing empty chunks.</span>
<a name="line-168"></a><span class='hs-definition'>printChunks</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-169"></a>            <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-comment'>-- ^ Print empty chunks</span>
<a name="line-170"></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-conid'>()</span>
<a name="line-171"></a><span class='hs-definition'>printChunks</span> <span class='hs-varid'>printEmpty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>continue</span> <span class='hs-varid'>loop</span> <span class='hs-keyword'>where</span>
<a name="line-172"></a>	<span class='hs-varid'>loop</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-keyword'>do</span>
<a name="line-173"></a>		<span class='hs-keyword'>let</span> <span class='hs-varid'>hide</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>null</span> <span class='hs-varid'>xs</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>not</span> <span class='hs-varid'>printEmpty</span>
<a name="line-174"></a>		<span class='hs-conid'>CM</span><span class='hs-varop'>.</span><span class='hs-varid'>unless</span> <span class='hs-varid'>hide</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>print</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-175"></a>		<span class='hs-varid'>continue</span> <span class='hs-varid'>loop</span>
<a name="line-176"></a>	
<a name="line-177"></a>	<span class='hs-varid'>loop</span> <span class='hs-conid'>EOF</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-178"></a>		<span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>putStrLn</span> <span class='hs-str'>"EOF"</span><span class='hs-layout'>)</span>
<a name="line-179"></a>		<span class='hs-varid'>yield</span> <span class='hs-conid'>()</span> <span class='hs-conid'>EOF</span>
<a name="line-180"></a>
<a name="line-181"></a><a name="enumList"></a><span class='hs-comment'>-- | @'enumList' n xs@ enumerates /xs/ as a stream, passing /n/ inputs per</span>
<a name="line-182"></a><span class='hs-comment'>-- chunk. This is primarily useful for testing, debugging, and REPL</span>
<a name="line-183"></a><span class='hs-comment'>-- exploration.</span>
<a name="line-184"></a><span class='hs-comment'>--</span>
<a name="line-185"></a><span class='hs-comment'>-- Compatibility note: In version 0.5, 'enumList' will be changed to the</span>
<a name="line-186"></a><span class='hs-comment'>-- type:</span>
<a name="line-187"></a><span class='hs-comment'>--</span>
<a name="line-188"></a><span class='hs-comment'>-- &gt; enumList :: Monad m =&gt; [a] -&gt; Enumerator a m b</span>
<a name="line-189"></a><span class='hs-definition'>enumList</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'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</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-190"></a><span class='hs-definition'>enumList</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-keyword'>where</span>
<a name="line-191"></a>	<span class='hs-varid'>loop</span> <span class='hs-varid'>xs</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'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span>
<a name="line-192"></a>		<span class='hs-layout'>(</span><span class='hs-varid'>s1</span><span class='hs-layout'>,</span> <span class='hs-varid'>s2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>genericSplitAt</span> <span class='hs-varid'>n</span> <span class='hs-varid'>xs</span>
<a name="line-193"></a>		<span class='hs-keyword'>in</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-varid'>s1</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;==</span> <span class='hs-varid'>loop</span> <span class='hs-varid'>s2</span>
<a name="line-194"></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>
<a name="line-195"></a>
<a name="line-196"></a><a name="enumLists"></a><span class='hs-comment'>-- | @'enumLists' xs@ enumerates /xs/ as a stream, where each element is a</span>
<a name="line-197"></a><span class='hs-comment'>-- separate chunk. This is primarily useful for testing and debugging.</span>
<a name="line-198"></a><span class='hs-comment'>--</span>
<a name="line-199"></a><span class='hs-comment'>-- Since: 0.4.15</span>
<a name="line-200"></a><span class='hs-definition'>enumLists</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-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</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-201"></a><span class='hs-definition'>enumLists</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-varid'>xss</span><span class='hs-layout'>)</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-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;==</span> <span class='hs-varid'>enumLists</span> <span class='hs-varid'>xss</span>
<a name="line-202"></a><span class='hs-definition'>enumLists</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>
<a name="line-203"></a>
<a name="line-204"></a><a name="runLists"></a><span class='hs-comment'>-- | Run an iteratee with the given input, and return either the final value</span>
<a name="line-205"></a><span class='hs-comment'>-- (if it succeeded) or the error (if it failed).</span>
<a name="line-206"></a><span class='hs-comment'>--</span>
<a name="line-207"></a><span class='hs-comment'>-- Since: 0.4.15</span>
<a name="line-208"></a><span class='hs-definition'>runLists</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-conid'>Identity</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>Exc</span><span class='hs-varop'>.</span><span class='hs-conid'>SomeException</span> <span class='hs-varid'>b</span>
<a name="line-209"></a><span class='hs-definition'>runLists</span> <span class='hs-varid'>lists</span> <span class='hs-varid'>iter</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runIdentity</span> <span class='hs-layout'>(</span><span class='hs-varid'>run</span> <span class='hs-layout'>(</span><span class='hs-varid'>enumLists</span> <span class='hs-varid'>lists</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>iter</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-210"></a>
<a name="line-211"></a><a name="runLists_"></a><span class='hs-comment'>-- | Like 'runLists', except errors are converted to exceptions and thrown.</span>
<a name="line-212"></a><span class='hs-comment'>--</span>
<a name="line-213"></a><span class='hs-comment'>-- Since: 0.4.15</span>
<a name="line-214"></a><span class='hs-definition'>runLists_</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-conid'>Identity</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-215"></a><span class='hs-definition'>runLists_</span> <span class='hs-varid'>lists</span> <span class='hs-varid'>iter</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runIdentity</span> <span class='hs-layout'>(</span><span class='hs-varid'>run_</span> <span class='hs-layout'>(</span><span class='hs-varid'>enumLists</span> <span class='hs-varid'>lists</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>iter</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-216"></a>
<a name="line-217"></a><a name="concatEnums"></a><span class='hs-comment'>-- | Compose a list of 'Enumerator's using @('&gt;==&gt;').@</span>
<a name="line-218"></a><span class='hs-definition'>concatEnums</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-keyglyph'>[</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>
<a name="line-219"></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-220"></a><span class='hs-definition'>concatEnums</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Prelude</span><span class='hs-varop'>.</span><span class='hs-varid'>foldl</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;==&gt;</span><span class='hs-layout'>)</span> <span class='hs-varid'>returnI</span>
<a name="line-221"></a>
<a name="line-222"></a><a name="joinI"></a><span class='hs-comment'>-- | &amp;#x201c;Wraps&amp;#x201d; an iteratee /inner/ in an enumeratee /wrapper/.</span>
<a name="line-223"></a><span class='hs-comment'>-- The resulting iteratee will consume /wrapper/&amp;#x2019;s input type and</span>
<a name="line-224"></a><span class='hs-comment'>-- yield /inner/&amp;#x2019;s output type.</span>
<a name="line-225"></a><span class='hs-comment'>--</span>
<a name="line-226"></a><span class='hs-comment'>-- See the documentation for ('=$').</span>
<a name="line-227"></a><span class='hs-comment'>--</span>
<a name="line-228"></a><span class='hs-comment'>-- @joinI (enum $$ iter) = enum =$ iter@</span>
<a name="line-229"></a><span class='hs-definition'>joinI</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'>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>
<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-definition'>joinI</span> <span class='hs-varid'>outer</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>outer</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>check</span> <span class='hs-keyword'>where</span>
<a name="line-232"></a>	<span class='hs-varid'>check</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-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>of</span>
<a name="line-233"></a>		<span class='hs-conid'>Continue</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-str'>"joinI: divergent iteratee"</span>
<a name="line-234"></a>		<span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>check</span> <span class='hs-varid'>s</span>
<a name="line-235"></a>	<span class='hs-varid'>check</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'>return</span> <span class='hs-varid'>x</span>
<a name="line-236"></a>	<span class='hs-varid'>check</span> <span class='hs-layout'>(</span><span class='hs-conid'>Error</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>throwError</span> <span class='hs-varid'>e</span>
<a name="line-237"></a>
<a name="line-238"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>0</span> <span class='hs-varop'>=$</span>
<a name="line-239"></a>
<a name="line-240"></a><a name="=$"></a><span class='hs-comment'>-- | &amp;#x201c;Wraps&amp;#x201d; an iteratee /inner/ in an enumeratee /wrapper/.</span>
<a name="line-241"></a><span class='hs-comment'>-- The resulting iteratee will consume /wrapper/&amp;#x2019;s input type and</span>
<a name="line-242"></a><span class='hs-comment'>-- yield /inner/&amp;#x2019;s output type.</span>
<a name="line-243"></a><span class='hs-comment'>--</span>
<a name="line-244"></a><span class='hs-comment'>-- Note: if the inner iteratee yields leftover input when it finishes,</span>
<a name="line-245"></a><span class='hs-comment'>-- that extra will be discarded.</span>
<a name="line-246"></a><span class='hs-comment'>--</span>
<a name="line-247"></a><span class='hs-comment'>-- As an example, consider an iteratee that converts a stream of UTF8-encoded</span>
<a name="line-248"></a><span class='hs-comment'>-- bytes into a single @Text@:</span>
<a name="line-249"></a><span class='hs-comment'>--</span>
<a name="line-250"></a><span class='hs-comment'>-- &gt; consumeUTF8 :: Monad m =&gt; Iteratee ByteString m Text</span>
<a name="line-251"></a><span class='hs-comment'>--</span>
<a name="line-252"></a><span class='hs-comment'>-- It could be written with either 'joinI' or @(=$)@:</span>
<a name="line-253"></a><span class='hs-comment'>--</span>
<a name="line-254"></a><span class='hs-comment'>-- &gt; import Data.Enumerator.Text as ET</span>
<a name="line-255"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-256"></a><span class='hs-comment'>-- &gt; consumeUTF8 = joinI (decode utf8 $$ ET.consume)</span>
<a name="line-257"></a><span class='hs-comment'>-- &gt; consumeUTF8 = decode utf8 =$ ET.consume</span>
<a name="line-258"></a><span class='hs-comment'>--</span>
<a name="line-259"></a><span class='hs-comment'>-- Since: 0.4.9</span>
<a name="line-260"></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> <span class='hs-keyglyph'>=&gt;</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'>-&gt;</span> <span class='hs-conid'>Iteratee</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-varid'>b</span>
<a name="line-261"></a><a name="enum"></a><span class='hs-definition'>enum</span> <span class='hs-varop'>=$</span> <span class='hs-varid'>iter</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>joinI</span> <span class='hs-layout'>(</span><span class='hs-varid'>enum</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>iter</span><span class='hs-layout'>)</span>
<a name="line-262"></a>
<a name="line-263"></a><a name="joinE"></a><span class='hs-comment'>-- | &amp;#x201c;Wraps&amp;#x201d; an enumerator /inner/ in an enumeratee /wrapper/.</span>
<a name="line-264"></a><span class='hs-comment'>-- The resulting enumerator will generate /wrapper/&amp;#x2019;s output type.</span>
<a name="line-265"></a><span class='hs-comment'>--</span>
<a name="line-266"></a><span class='hs-comment'>-- See the documentation for ('$=').</span>
<a name="line-267"></a><span class='hs-comment'>--</span>
<a name="line-268"></a><span class='hs-comment'>-- @joinE enum enee = enum $= enee@</span>
<a name="line-269"></a><span class='hs-comment'>--</span>
<a name="line-270"></a><span class='hs-comment'>-- Since: 0.4.5</span>
<a name="line-271"></a><span class='hs-definition'>joinE</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span>
<a name="line-272"></a>      <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Enumerator</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-273"></a>      <span class='hs-keyglyph'>-&gt;</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>
<a name="line-274"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Enumerator</span> <span class='hs-varid'>ai</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-275"></a><span class='hs-definition'>joinE</span> <span class='hs-varid'>enum</span> <span class='hs-varid'>enee</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-276"></a>	<span class='hs-varid'>step</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runIteratee</span> <span class='hs-layout'>(</span><span class='hs-varid'>enumEOF</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>enum</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>enee</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-277"></a>	<span class='hs-keyword'>case</span> <span class='hs-varid'>step</span> <span class='hs-keyword'>of</span>
<a name="line-278"></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-279"></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-varid'>x</span>
<a name="line-280"></a>		<span class='hs-conid'>Continue</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-str'>"joinE: divergent iteratee"</span>
<a name="line-281"></a>
<a name="line-282"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>1</span> <span class='hs-varop'>$=</span>
<a name="line-283"></a>
<a name="line-284"></a><a name="$="></a><span class='hs-comment'>-- | &amp;#x201c;Wraps&amp;#x201d; an enumerator /inner/ in an enumeratee /wrapper/.</span>
<a name="line-285"></a><span class='hs-comment'>-- The resulting enumerator will generate /wrapper/&amp;#x2019;s output type.</span>
<a name="line-286"></a><span class='hs-comment'>--</span>
<a name="line-287"></a><span class='hs-comment'>-- As an example, consider an enumerator that yields line character counts</span>
<a name="line-288"></a><span class='hs-comment'>-- for a text file (e.g. for source code readability checking):</span>
<a name="line-289"></a><span class='hs-comment'>--</span>
<a name="line-290"></a><span class='hs-comment'>-- &gt; enumFileCounts :: FilePath -&gt; Enumerator Int IO b</span>
<a name="line-291"></a><span class='hs-comment'>--</span>
<a name="line-292"></a><span class='hs-comment'>-- It could be written with either 'joinE' or @($=)@:</span>
<a name="line-293"></a><span class='hs-comment'>--</span>
<a name="line-294"></a><span class='hs-comment'>-- &gt; import Data.Text as T</span>
<a name="line-295"></a><span class='hs-comment'>-- &gt; import Data.Enumerator.List as EL</span>
<a name="line-296"></a><span class='hs-comment'>-- &gt; import Data.Enumerator.Text as ET</span>
<a name="line-297"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-298"></a><span class='hs-comment'>-- &gt; enumFileCounts path = joinE (enumFile path) (EL.map T.length)</span>
<a name="line-299"></a><span class='hs-comment'>-- &gt; enumFileCounts path = enumFile path $= EL.map T.length</span>
<a name="line-300"></a><span class='hs-comment'>--</span>
<a name="line-301"></a><span class='hs-comment'>-- Compatibility note: in version 0.4.15, the associativity of @($=)@ was</span>
<a name="line-302"></a><span class='hs-comment'>-- changed from @infixr 0@ to @infixl 1@.</span>
<a name="line-303"></a><span class='hs-comment'>--</span>
<a name="line-304"></a><span class='hs-comment'>-- Since: 0.4.9</span>
<a name="line-305"></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-306"></a>     <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Enumerator</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-307"></a>     <span class='hs-keyglyph'>-&gt;</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>
<a name="line-308"></a>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Enumerator</span> <span class='hs-varid'>ai</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-309"></a><span class='hs-layout'>(</span><span class='hs-varop'>$=</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>joinE</span>
<a name="line-310"></a>
<a name="line-311"></a><a name="=$="></a><span class='hs-comment'>-- | Composes two enumeratees.</span>
<a name="line-312"></a><span class='hs-comment'>--</span>
<a name="line-313"></a><span class='hs-comment'>-- Note that if the inner enumeratee yields left-over input, this will be</span>
<a name="line-314"></a><span class='hs-comment'>-- discarded.</span>
<a name="line-315"></a><span class='hs-comment'>--</span>
<a name="line-316"></a><span class='hs-comment'>-- Example: converting bytes into lower-case text:</span>
<a name="line-317"></a><span class='hs-comment'>--</span>
<a name="line-318"></a><span class='hs-comment'>-- &gt; import Data.ByteString</span>
<a name="line-319"></a><span class='hs-comment'>-- &gt; import Data.Text</span>
<a name="line-320"></a><span class='hs-comment'>-- &gt; import Data.Enumerator.List as EnumList</span>
<a name="line-321"></a><span class='hs-comment'>-- &gt; import Data.Enumerator.Text</span>
<a name="line-322"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-323"></a><span class='hs-comment'>-- &gt; decodeAndLower :: Monad m =&gt; Enumeratee ByteString Text m b</span>
<a name="line-324"></a><span class='hs-comment'>-- &gt; decodeAndLower = decode utf8 =$= EnumList.map toLower</span>
<a name="line-325"></a><span class='hs-comment'>--</span>
<a name="line-326"></a><span class='hs-comment'>-- Since: 0.4.17</span>
<a name="line-327"></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-328"></a>      <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Enumeratee</span> <span class='hs-varid'>a1</span> <span class='hs-varid'>a2</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Step</span> <span class='hs-varid'>a3</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-329"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Enumeratee</span> <span class='hs-varid'>a2</span> <span class='hs-varid'>a3</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-330"></a>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Enumeratee</span> <span class='hs-varid'>a1</span> <span class='hs-varid'>a3</span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-331"></a><a name="e1"></a><span class='hs-definition'>e1</span> <span class='hs-varop'>=$=</span> <span class='hs-varid'>e2</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>joinI</span> <span class='hs-layout'>(</span><span class='hs-varid'>e1</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>e2</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-332"></a>
<a name="line-333"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>1</span> <span class='hs-varop'>=$=</span>
<a name="line-334"></a>
<a name="line-335"></a><a name="sequence"></a><span class='hs-comment'>-- | Feeds outer input elements into the provided iteratee until it yields</span>
<a name="line-336"></a><span class='hs-comment'>-- an inner input, passes that to the inner iteratee, and then loops.</span>
<a name="line-337"></a><span class='hs-definition'>sequence</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'>Iteratee</span> <span class='hs-varid'>ao</span> <span class='hs-varid'>m</span> <span class='hs-varid'>ai</span>
<a name="line-338"></a>         <span class='hs-keyglyph'>-&gt;</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>
<a name="line-339"></a><span class='hs-definition'>sequence</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-keyword'>where</span>
<a name="line-340"></a>	<span class='hs-varid'>loop</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>checkDone</span> <span class='hs-varid'>check</span>
<a name="line-341"></a>	<span class='hs-varid'>check</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isEOF</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>f</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>f</span>
<a name="line-342"></a>		<span class='hs-keyword'>then</span> <span class='hs-varid'>yield</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-conid'>EOF</span>
<a name="line-343"></a>		<span class='hs-keyword'>else</span> <span class='hs-varid'>step</span> <span class='hs-varid'>k</span>
<a name="line-344"></a>	<span class='hs-varid'>step</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>v</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;==</span> <span class='hs-varid'>loop</span>
<a name="line-345"></a>
<a name="line-346"></a><a name="isEOF"></a><span class='hs-comment'>-- | Check whether a stream has reached EOF. Note that if the stream is not</span>
<a name="line-347"></a><span class='hs-comment'>-- at EOF, @isEOF@ may cause data to be read from the enumerator.</span>
<a name="line-348"></a><span class='hs-definition'>isEOF</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'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Bool</span>
<a name="line-349"></a><span class='hs-definition'>isEOF</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>continue</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>of</span>
<a name="line-350"></a>	<span class='hs-conid'>EOF</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>yield</span> <span class='hs-conid'>True</span> <span class='hs-varid'>s</span>
<a name="line-351"></a>	<span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>yield</span> <span class='hs-conid'>False</span> <span class='hs-varid'>s</span>
<a name="line-352"></a>
<a name="line-353"></a><a name="tryIO"></a><span class='hs-comment'>-- | Try to run an IO computation. If it throws an exception, the exception</span>
<a name="line-354"></a><span class='hs-comment'>-- is caught and passed to 'throwError'.</span>
<a name="line-355"></a><span class='hs-comment'>--</span>
<a name="line-356"></a><span class='hs-comment'>-- Since: 0.4.9</span>
<a name="line-357"></a><span class='hs-definition'>tryIO</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>IO</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-358"></a><span class='hs-definition'>tryIO</span> <span class='hs-varid'>io</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-359"></a>	<span class='hs-varid'>tried</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>liftIO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Exc</span><span class='hs-varop'>.</span><span class='hs-varid'>try</span> <span class='hs-varid'>io</span><span class='hs-layout'>)</span>
<a name="line-360"></a>	<span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>tried</span> <span class='hs-keyword'>of</span>
<a name="line-361"></a>		<span class='hs-conid'>Right</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Yield</span> <span class='hs-varid'>b</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-362"></a>		<span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Error</span> <span class='hs-varid'>err</span>
<a name="line-363"></a>
<a name="line-364"></a><a name="liftTrans"></a><span class='hs-comment'>-- | Lift an 'Iteratee' onto a monad transformer, re-wrapping its</span>
<a name="line-365"></a><span class='hs-comment'>-- inner monadic values.</span>
<a name="line-366"></a><span class='hs-comment'>--</span>
<a name="line-367"></a><span class='hs-comment'>-- Since: 0.1.1</span>
<a name="line-368"></a><span class='hs-definition'>liftTrans</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MonadTrans</span> <span class='hs-varid'>t</span><span class='hs-layout'>,</span> <span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-369"></a>             <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-conid'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-varid'>b</span>
<a name="line-370"></a><span class='hs-definition'>liftTrans</span> <span class='hs-varid'>iter</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Iteratee</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-371"></a>	<span class='hs-varid'>step</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lift</span> <span class='hs-layout'>(</span><span class='hs-varid'>runIteratee</span> <span class='hs-varid'>iter</span><span class='hs-layout'>)</span>
<a name="line-372"></a>	<span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>step</span> <span class='hs-keyword'>of</span>
<a name="line-373"></a>		<span class='hs-conid'>Yield</span> <span class='hs-varid'>x</span> <span class='hs-varid'>cs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Yield</span> <span class='hs-varid'>x</span> <span class='hs-varid'>cs</span>
<a name="line-374"></a>		<span class='hs-conid'>Error</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Error</span> <span class='hs-varid'>err</span>
<a name="line-375"></a>		<span class='hs-conid'>Continue</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Continue</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftTrans</span> <span class='hs-varop'>.</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-376"></a>
<a name="line-377"></a><a name="peek"></a><span class='hs-comment'>-- | Peek at the next element in the stream, or 'Nothing' if the stream</span>
<a name="line-378"></a><span class='hs-comment'>-- has ended.</span>
<a name="line-379"></a><span class='hs-definition'>peek</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'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-380"></a><span class='hs-definition'>peek</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>continue</span> <span class='hs-varid'>loop</span> <span class='hs-keyword'>where</span>
<a name="line-381"></a>	<span class='hs-varid'>loop</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'>=</span> <span class='hs-varid'>continue</span> <span class='hs-varid'>loop</span>
<a name="line-382"></a>	<span class='hs-varid'>loop</span> <span class='hs-varid'>chunk</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Chunks</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>yield</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>chunk</span>
<a name="line-383"></a>	<span class='hs-varid'>loop</span> <span class='hs-conid'>EOF</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>yield</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>EOF</span>
<a name="line-384"></a>
<a name="line-385"></a><a name="last"></a><span class='hs-comment'>-- | Get the last element in the stream, or 'Nothing' if the stream</span>
<a name="line-386"></a><span class='hs-comment'>-- has ended.</span>
<a name="line-387"></a><span class='hs-comment'>--</span>
<a name="line-388"></a><span class='hs-comment'>-- Consumes the entire stream.</span>
<a name="line-389"></a><span class='hs-definition'>last</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'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-390"></a><span class='hs-definition'>last</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>continue</span> <span class='hs-layout'>(</span><span class='hs-varid'>loop</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-391"></a>	<span class='hs-varid'>loop</span> <span class='hs-varid'>ret</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-varid'>continue</span> <span class='hs-varop'>.</span> <span class='hs-varid'>loop</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>xs</span> <span class='hs-keyword'>of</span>
<a name="line-392"></a>		<span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ret</span>
<a name="line-393"></a>		<span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>Prelude</span><span class='hs-varop'>.</span><span class='hs-varid'>last</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-394"></a>	<span class='hs-varid'>loop</span> <span class='hs-varid'>ret</span> <span class='hs-conid'>EOF</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>yield</span> <span class='hs-varid'>ret</span> <span class='hs-conid'>EOF</span>
<a name="line-395"></a>
<a name="line-396"></a><a name="length"></a><span class='hs-comment'>-- | Get how many elements remained in the stream.</span>
<a name="line-397"></a><span class='hs-comment'>--</span>
<a name="line-398"></a><span class='hs-comment'>-- Consumes the entire stream.</span>
<a name="line-399"></a><span class='hs-definition'>length</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'>Iteratee</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Integer</span>
<a name="line-400"></a><span class='hs-definition'>length</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>continue</span> <span class='hs-layout'>(</span><span class='hs-varid'>loop</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-401"></a>	<span class='hs-varid'>len</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>genericLength</span>
<a name="line-402"></a>	<span class='hs-varid'>loop</span> <span class='hs-varid'>n</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-varid'>continue</span> <span class='hs-layout'>(</span><span class='hs-varid'>loop</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span> <span class='hs-varop'>+</span> <span class='hs-varid'>len</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-403"></a>	<span class='hs-varid'>loop</span> <span class='hs-varid'>n</span> <span class='hs-conid'>EOF</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>yield</span> <span class='hs-varid'>n</span> <span class='hs-conid'>EOF</span>
</pre></body>
</html>