This file is indexed.

/usr/share/doc/libghc-cabal-doc/html/src/Distribution-Compat-ReadP.html is in libghc-cabal-doc 1.20.0.2-1.

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
<?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>Distribution/Compat/ReadP.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'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module      :  Distribution.Compat.ReadP</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright   :  (c) The University of Glasgow 2002</span>
<a name="line-5"></a><span class='hs-comment'>-- License     :  BSD-style (see the file libraries/base/LICENSE)</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- Maintainer  :  libraries@haskell.org</span>
<a name="line-8"></a><span class='hs-comment'>-- Portability :  portable</span>
<a name="line-9"></a><span class='hs-comment'>--</span>
<a name="line-10"></a><span class='hs-comment'>-- This is a library of parser combinators, originally written by Koen Claessen.</span>
<a name="line-11"></a><span class='hs-comment'>-- It parses all alternatives in parallel, so it never keeps hold of</span>
<a name="line-12"></a><span class='hs-comment'>-- the beginning of the input string, a common source of space leaks with</span>
<a name="line-13"></a><span class='hs-comment'>-- other parsers.  The '(+++)' choice combinator is genuinely commutative;</span>
<a name="line-14"></a><span class='hs-comment'>-- it makes no difference which branch is \"shorter\".</span>
<a name="line-15"></a><span class='hs-comment'>--</span>
<a name="line-16"></a><span class='hs-comment'>-- See also Koen's paper /Parallel Parsing Processes/</span>
<a name="line-17"></a><span class='hs-comment'>-- (&lt;<a href="http://www.cs.chalmers.se/~koen/publications.html">http://www.cs.chalmers.se/~koen/publications.html</a>&gt;).</span>
<a name="line-18"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><span class='hs-comment'>-- This version of ReadP has been locally hacked to make it H98, by</span>
<a name="line-20"></a><span class='hs-comment'>-- Martin Sj&amp;#xF6;gren &lt;mailto:msjogren@gmail.com&gt;</span>
<a name="line-21"></a><span class='hs-comment'>--</span>
<a name="line-22"></a><span class='hs-comment'>-- The unit tests have been moved to UnitTest.Distribution.Compat.ReadP, by</span>
<a name="line-23"></a><span class='hs-comment'>-- Mark Lentczner &lt;mailto:mark@glyphic.com&gt;</span>
<a name="line-24"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Compat</span><span class='hs-varop'>.</span><span class='hs-conid'>ReadP</span>
<a name="line-27"></a>  <span class='hs-layout'>(</span>
<a name="line-28"></a>  <span class='hs-comment'>-- * The 'ReadP' type</span>
<a name="line-29"></a>  <span class='hs-conid'>ReadP</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: * -&gt; *; instance Functor, Monad, MonadPlus</span>
<a name="line-30"></a>
<a name="line-31"></a>  <span class='hs-comment'>-- * Primitive operations</span>
<a name="line-32"></a>  <span class='hs-varid'>get</span><span class='hs-layout'>,</span>        <span class='hs-comment'>-- :: ReadP Char</span>
<a name="line-33"></a>  <span class='hs-varid'>look</span><span class='hs-layout'>,</span>       <span class='hs-comment'>-- :: ReadP String</span>
<a name="line-34"></a>  <span class='hs-layout'>(</span><span class='hs-varop'>+++</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: ReadP a -&gt; ReadP a -&gt; ReadP a</span>
<a name="line-35"></a>  <span class='hs-layout'>(</span><span class='hs-varop'>&lt;++</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: ReadP a -&gt; ReadP a -&gt; ReadP a</span>
<a name="line-36"></a>  <span class='hs-varid'>gather</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- :: ReadP a -&gt; ReadP (String, a)</span>
<a name="line-37"></a>
<a name="line-38"></a>  <span class='hs-comment'>-- * Other operations</span>
<a name="line-39"></a>  <span class='hs-varid'>pfail</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: ReadP a</span>
<a name="line-40"></a>  <span class='hs-varid'>satisfy</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- :: (Char -&gt; Bool) -&gt; ReadP Char</span>
<a name="line-41"></a>  <span class='hs-varid'>char</span><span class='hs-layout'>,</span>       <span class='hs-comment'>-- :: Char -&gt; ReadP Char</span>
<a name="line-42"></a>  <span class='hs-varid'>string</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- :: String -&gt; ReadP String</span>
<a name="line-43"></a>  <span class='hs-varid'>munch</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: (Char -&gt; Bool) -&gt; ReadP String</span>
<a name="line-44"></a>  <span class='hs-varid'>munch1</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- :: (Char -&gt; Bool) -&gt; ReadP String</span>
<a name="line-45"></a>  <span class='hs-varid'>skipSpaces</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- :: ReadP ()</span>
<a name="line-46"></a>  <span class='hs-varid'>choice</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- :: [ReadP a] -&gt; ReadP a</span>
<a name="line-47"></a>  <span class='hs-varid'>count</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: Int -&gt; ReadP a -&gt; ReadP [a]</span>
<a name="line-48"></a>  <span class='hs-varid'>between</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- :: ReadP open -&gt; ReadP close -&gt; ReadP a -&gt; ReadP a</span>
<a name="line-49"></a>  <span class='hs-varid'>option</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- :: a -&gt; ReadP a -&gt; ReadP a</span>
<a name="line-50"></a>  <span class='hs-varid'>optional</span><span class='hs-layout'>,</span>   <span class='hs-comment'>-- :: ReadP a -&gt; ReadP ()</span>
<a name="line-51"></a>  <span class='hs-varid'>many</span><span class='hs-layout'>,</span>       <span class='hs-comment'>-- :: ReadP a -&gt; ReadP [a]</span>
<a name="line-52"></a>  <span class='hs-varid'>many1</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: ReadP a -&gt; ReadP [a]</span>
<a name="line-53"></a>  <span class='hs-varid'>skipMany</span><span class='hs-layout'>,</span>   <span class='hs-comment'>-- :: ReadP a -&gt; ReadP ()</span>
<a name="line-54"></a>  <span class='hs-varid'>skipMany1</span><span class='hs-layout'>,</span>  <span class='hs-comment'>-- :: ReadP a -&gt; ReadP ()</span>
<a name="line-55"></a>  <span class='hs-varid'>sepBy</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: ReadP a -&gt; ReadP sep -&gt; ReadP [a]</span>
<a name="line-56"></a>  <span class='hs-varid'>sepBy1</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- :: ReadP a -&gt; ReadP sep -&gt; ReadP [a]</span>
<a name="line-57"></a>  <span class='hs-varid'>endBy</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: ReadP a -&gt; ReadP sep -&gt; ReadP [a]</span>
<a name="line-58"></a>  <span class='hs-varid'>endBy1</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- :: ReadP a -&gt; ReadP sep -&gt; ReadP [a]</span>
<a name="line-59"></a>  <span class='hs-varid'>chainr</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- :: ReadP a -&gt; ReadP (a -&gt; a -&gt; a) -&gt; a -&gt; ReadP a</span>
<a name="line-60"></a>  <span class='hs-varid'>chainl</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- :: ReadP a -&gt; ReadP (a -&gt; a -&gt; a) -&gt; a -&gt; ReadP a</span>
<a name="line-61"></a>  <span class='hs-varid'>chainl1</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- :: ReadP a -&gt; ReadP (a -&gt; a -&gt; a) -&gt; ReadP a</span>
<a name="line-62"></a>  <span class='hs-varid'>chainr1</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- :: ReadP a -&gt; ReadP (a -&gt; a -&gt; a) -&gt; ReadP a</span>
<a name="line-63"></a>  <span class='hs-varid'>manyTill</span><span class='hs-layout'>,</span>   <span class='hs-comment'>-- :: ReadP a -&gt; ReadP end -&gt; ReadP [a]</span>
<a name="line-64"></a>
<a name="line-65"></a>  <span class='hs-comment'>-- * Running a parser</span>
<a name="line-66"></a>  <span class='hs-conid'>ReadS</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- :: *; = String -&gt; [(a,String)]</span>
<a name="line-67"></a>  <span class='hs-varid'>readP_to_S</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- :: ReadP a -&gt; ReadS a</span>
<a name="line-68"></a>  <span class='hs-varid'>readS_to_P</span>  <span class='hs-comment'>-- :: ReadS a -&gt; ReadP a</span>
<a name="line-69"></a>  <span class='hs-layout'>)</span>
<a name="line-70"></a> <span class='hs-keyword'>where</span>
<a name="line-71"></a>
<a name="line-72"></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-layout'>(</span> <span class='hs-conid'>MonadPlus</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftM</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftM2</span><span class='hs-layout'>,</span> <span class='hs-varid'>ap</span> <span class='hs-layout'>)</span>
<a name="line-73"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span> <span class='hs-layout'>(</span><span class='hs-varid'>isSpace</span><span class='hs-layout'>)</span>
<a name="line-74"></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-layout'>(</span><span class='hs-conid'>Applicative</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Alternative</span><span class='hs-layout'>(</span><span class='hs-varid'>empty</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;|&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-75"></a>
<a name="line-76"></a><span class='hs-keyword'>infixr</span> <span class='hs-num'>5</span> <span class='hs-varop'>+++</span><span class='hs-layout'>,</span> <span class='hs-varop'>&lt;++</span>
<a name="line-77"></a>
<a name="line-78"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-79"></a><span class='hs-comment'>-- The P type</span>
<a name="line-80"></a><span class='hs-comment'>-- is representation type -- should be kept abstract</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="P"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>P</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-83"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Get</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>P</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-84"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>s</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>P</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-85"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Fail</span>
<a name="line-86"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Result</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>P</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-87"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Final</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>s</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- invariant: list is non-empty!</span>
<a name="line-88"></a>
<a name="line-89"></a><span class='hs-comment'>-- Monad, MonadPlus</span>
<a name="line-90"></a>
<a name="line-91"></a><a name="instance%20Functor%20(P%20s)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>P</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-92"></a>  <span class='hs-varid'>fmap</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span>
<a name="line-93"></a>
<a name="line-94"></a><a name="instance%20Applicative%20(P%20s)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>P</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-95"></a>  <span class='hs-varid'>pure</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span>
<a name="line-96"></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-varid'>ap</span>
<a name="line-97"></a>
<a name="line-98"></a><a name="instance%20Monad%20(P%20s)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-conid'>P</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-99"></a>  <span class='hs-varid'>return</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Result</span> <span class='hs-varid'>x</span> <span class='hs-conid'>Fail</span>
<a name="line-100"></a>
<a name="line-101"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>Get</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>      <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Get</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-102"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>Look</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>     <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-103"></a>  <span class='hs-conid'>Fail</span>         <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span>
<a name="line-104"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-varid'>x</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varop'>`mplus`</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-105"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>Final</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>    <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>final</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ys'</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>ys'</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-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span><span class='hs-keyglyph'>]</span>
<a name="line-106"></a>
<a name="line-107"></a>  <span class='hs-varid'>fail</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span>
<a name="line-108"></a>
<a name="line-109"></a><a name="instance%20Alternative%20(P%20s)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Alternative</span> <span class='hs-layout'>(</span><span class='hs-conid'>P</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-110"></a>      <span class='hs-varid'>empty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mzero</span>
<a name="line-111"></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-varid'>mplus</span>
<a name="line-112"></a>
<a name="line-113"></a><a name="instance%20MonadPlus%20(P%20s)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadPlus</span> <span class='hs-layout'>(</span><span class='hs-conid'>P</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-114"></a>  <span class='hs-varid'>mzero</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span>
<a name="line-115"></a>
<a name="line-116"></a>  <span class='hs-comment'>-- most common case: two gets are combined</span>
<a name="line-117"></a>  <span class='hs-conid'>Get</span> <span class='hs-varid'>f1</span>     <span class='hs-varop'>`mplus`</span> <span class='hs-conid'>Get</span> <span class='hs-varid'>f2</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Get</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f1</span> <span class='hs-varid'>c</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>f2</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-118"></a>
<a name="line-119"></a>  <span class='hs-comment'>-- results are delivered as soon as possible</span>
<a name="line-120"></a>  <span class='hs-conid'>Result</span> <span class='hs-varid'>x</span> <span class='hs-varid'>p</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>q</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Result</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span>
<a name="line-121"></a>  <span class='hs-varid'>p</span>          <span class='hs-varop'>`mplus`</span> <span class='hs-conid'>Result</span> <span class='hs-varid'>x</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Result</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span>
<a name="line-122"></a>
<a name="line-123"></a>  <span class='hs-comment'>-- fail disappears</span>
<a name="line-124"></a>  <span class='hs-conid'>Fail</span>       <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>p</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span>
<a name="line-125"></a>  <span class='hs-varid'>p</span>          <span class='hs-varop'>`mplus`</span> <span class='hs-conid'>Fail</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span>
<a name="line-126"></a>
<a name="line-127"></a>  <span class='hs-comment'>-- two finals are combined</span>
<a name="line-128"></a>  <span class='hs-comment'>-- final + look becomes one look and one final (=optimization)</span>
<a name="line-129"></a>  <span class='hs-comment'>-- final + sthg else becomes one look and one final</span>
<a name="line-130"></a>  <span class='hs-conid'>Final</span> <span class='hs-varid'>r</span>    <span class='hs-varop'>`mplus`</span> <span class='hs-conid'>Final</span> <span class='hs-varid'>t</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Final</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varop'>++</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-131"></a>  <span class='hs-conid'>Final</span> <span class='hs-varid'>r</span>    <span class='hs-varop'>`mplus`</span> <span class='hs-conid'>Look</span> <span class='hs-varid'>f</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Final</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varop'>++</span> <span class='hs-varid'>run</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-132"></a>  <span class='hs-conid'>Final</span> <span class='hs-varid'>r</span>    <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>p</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Final</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varop'>++</span> <span class='hs-varid'>run</span> <span class='hs-varid'>p</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-133"></a>  <span class='hs-conid'>Look</span> <span class='hs-varid'>f</span>     <span class='hs-varop'>`mplus`</span> <span class='hs-conid'>Final</span> <span class='hs-varid'>r</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Final</span> <span class='hs-layout'>(</span><span class='hs-varid'>run</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span> <span class='hs-varop'>++</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-134"></a>  <span class='hs-varid'>p</span>          <span class='hs-varop'>`mplus`</span> <span class='hs-conid'>Final</span> <span class='hs-varid'>r</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Final</span> <span class='hs-layout'>(</span><span class='hs-varid'>run</span> <span class='hs-varid'>p</span> <span class='hs-varid'>s</span> <span class='hs-varop'>++</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-135"></a>
<a name="line-136"></a>  <span class='hs-comment'>-- two looks are combined (=optimization)</span>
<a name="line-137"></a>  <span class='hs-comment'>-- look + sthg else floats upwards</span>
<a name="line-138"></a>  <span class='hs-conid'>Look</span> <span class='hs-varid'>f</span>     <span class='hs-varop'>`mplus`</span> <span class='hs-conid'>Look</span> <span class='hs-varid'>g</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>g</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-139"></a>  <span class='hs-conid'>Look</span> <span class='hs-varid'>f</span>     <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>p</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-140"></a>  <span class='hs-varid'>p</span>          <span class='hs-varop'>`mplus`</span> <span class='hs-conid'>Look</span> <span class='hs-varid'>f</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>p</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>f</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-141"></a>
<a name="line-142"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-143"></a><span class='hs-comment'>-- The ReadP type</span>
<a name="line-144"></a>
<a name="line-145"></a><a name="Parser"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Parser</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>P</span> <span class='hs-varid'>s</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>P</span> <span class='hs-varid'>s</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-146"></a><a name="ReadP"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</span> <span class='hs-varid'>r</span> <span class='hs-conid'>Char</span> <span class='hs-varid'>a</span>
<a name="line-147"></a>
<a name="line-148"></a><span class='hs-comment'>-- Functor, Monad, MonadPlus</span>
<a name="line-149"></a>
<a name="line-150"></a><a name="instance%20Functor%20(Parser%20r%20s)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>Parser</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-151"></a>  <span class='hs-varid'>fmap</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>R</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-varop'>.</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-152"></a>
<a name="line-153"></a><a name="instance%20Applicative%20(Parser%20r%20s)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>Parser</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-154"></a>  <span class='hs-varid'>pure</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span>
<a name="line-155"></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-varid'>ap</span>
<a name="line-156"></a>
<a name="line-157"></a><a name="instance%20Monad%20(Parser%20r%20s)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-conid'>Parser</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-158"></a>  <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-159"></a>  <span class='hs-varid'>fail</span> <span class='hs-keyword'>_</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Fail</span><span class='hs-layout'>)</span>
<a name="line-160"></a>  <span class='hs-conid'>R</span> <span class='hs-varid'>m</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-conid'>R</span> <span class='hs-varid'>m'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>m'</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-161"></a>
<a name="line-162"></a><span class='hs-comment'>--instance MonadPlus (Parser r s) where</span>
<a name="line-163"></a><span class='hs-comment'>--  mzero = pfail</span>
<a name="line-164"></a><span class='hs-comment'>--  mplus = (+++)</span>
<a name="line-165"></a>
<a name="line-166"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-167"></a><span class='hs-comment'>-- Operations over P</span>
<a name="line-168"></a>
<a name="line-169"></a><a name="final"></a><span class='hs-definition'>final</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>s</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>P</span> <span class='hs-varid'>s</span> <span class='hs-varid'>a</span>
<a name="line-170"></a><span class='hs-comment'>-- Maintains invariant for Final constructor</span>
<a name="line-171"></a><span class='hs-definition'>final</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span>
<a name="line-172"></a><span class='hs-definition'>final</span> <span class='hs-varid'>r</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Final</span> <span class='hs-varid'>r</span>
<a name="line-173"></a>
<a name="line-174"></a><a name="run"></a><span class='hs-definition'>run</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>P</span> <span class='hs-varid'>c</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>c</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-175"></a><span class='hs-definition'>run</span> <span class='hs-layout'>(</span><span class='hs-conid'>Get</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>      <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>run</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-176"></a><span class='hs-definition'>run</span> <span class='hs-layout'>(</span><span class='hs-conid'>Look</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>     <span class='hs-varid'>s</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>run</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-177"></a><span class='hs-definition'>run</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-varid'>x</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>run</span> <span class='hs-varid'>p</span> <span class='hs-varid'>s</span>
<a name="line-178"></a><span class='hs-definition'>run</span> <span class='hs-layout'>(</span><span class='hs-conid'>Final</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>    <span class='hs-keyword'>_</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-179"></a><span class='hs-definition'>run</span> <span class='hs-keyword'>_</span>            <span class='hs-keyword'>_</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-180"></a>
<a name="line-181"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-182"></a><span class='hs-comment'>-- Operations over ReadP</span>
<a name="line-183"></a>
<a name="line-184"></a><a name="get"></a><span class='hs-definition'>get</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>Char</span>
<a name="line-185"></a><span class='hs-comment'>-- ^ Consumes and returns the next character.</span>
<a name="line-186"></a><span class='hs-comment'>--   Fails if there is no input left.</span>
<a name="line-187"></a><span class='hs-definition'>get</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-conid'>Get</span>
<a name="line-188"></a>
<a name="line-189"></a><a name="look"></a><span class='hs-definition'>look</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>String</span>
<a name="line-190"></a><span class='hs-comment'>-- ^ Look-ahead: returns the part of the input that is left, without</span>
<a name="line-191"></a><span class='hs-comment'>--   consuming it.</span>
<a name="line-192"></a><span class='hs-definition'>look</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-conid'>Look</span>
<a name="line-193"></a>
<a name="line-194"></a><a name="pfail"></a><span class='hs-definition'>pfail</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-195"></a><span class='hs-comment'>-- ^ Always fails.</span>
<a name="line-196"></a><span class='hs-definition'>pfail</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Fail</span><span class='hs-layout'>)</span>
<a name="line-197"></a>
<a name="line-198"></a><a name="+++"></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'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-199"></a><span class='hs-comment'>-- ^ Symmetric choice.</span>
<a name="line-200"></a><span class='hs-conid'>R</span> <span class='hs-varid'>f1</span> <span class='hs-varop'>+++</span> <span class='hs-conid'>R</span> <span class='hs-varid'>f2</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f1</span> <span class='hs-varid'>k</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>f2</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-201"></a>
<a name="line-202"></a><a name="%3c++"></a><span class='hs-layout'>(</span><span class='hs-varop'>&lt;++</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>a</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-203"></a><span class='hs-comment'>-- ^ Local, exclusive, left-biased choice: If left parser</span>
<a name="line-204"></a><span class='hs-comment'>--   locally produces any result at all, then right parser is</span>
<a name="line-205"></a><span class='hs-comment'>--   not used.</span>
<a name="line-206"></a><span class='hs-conid'>R</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&lt;++</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span>
<a name="line-207"></a>  <span class='hs-keyword'>do</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>look</span>
<a name="line-208"></a>     <span class='hs-varid'>probe</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>return</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span> <span class='hs-num'>0</span>
<a name="line-209"></a> <span class='hs-keyword'>where</span>
<a name="line-210"></a>  <span class='hs-varid'>probe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Get</span> <span class='hs-varid'>f'</span><span class='hs-layout'>)</span>       <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>probe</span> <span class='hs-layout'>(</span><span class='hs-varid'>f'</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-211"></a>  <span class='hs-varid'>probe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Look</span> <span class='hs-varid'>f'</span><span class='hs-layout'>)</span>      <span class='hs-varid'>s</span>     <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>probe</span> <span class='hs-layout'>(</span><span class='hs-varid'>f'</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span> <span class='hs-varid'>n</span>
<a name="line-212"></a>  <span class='hs-varid'>probe</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span>     <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>discard</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;=</span><span class='hs-layout'>)</span>
<a name="line-213"></a>  <span class='hs-varid'>probe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Final</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>      <span class='hs-keyword'>_</span>     <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-conid'>Final</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&gt;&gt;=</span><span class='hs-layout'>)</span>
<a name="line-214"></a>  <span class='hs-varid'>probe</span> <span class='hs-keyword'>_</span>              <span class='hs-keyword'>_</span>     <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>q</span>
<a name="line-215"></a>
<a name="line-216"></a>  <span class='hs-varid'>discard</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-217"></a>  <span class='hs-varid'>discard</span> <span class='hs-varid'>n</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>discard</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-num'>1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-218"></a>
<a name="line-219"></a><a name="gather"></a><span class='hs-definition'>gather</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>P</span> <span class='hs-conid'>Char</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-220"></a><span class='hs-comment'>-- ^ Transforms a parser into one that does the same, but</span>
<a name="line-221"></a><span class='hs-comment'>--   in addition returns the exact characters read.</span>
<a name="line-222"></a><span class='hs-comment'>--   IMPORTANT NOTE: 'gather' gives a runtime error if its first argument</span>
<a name="line-223"></a><span class='hs-comment'>--   is built using any occurrences of readS_to_P.</span>
<a name="line-224"></a><span class='hs-definition'>gather</span> <span class='hs-layout'>(</span><span class='hs-conid'>R</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-225"></a>  <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>gath</span> <span class='hs-varid'>id</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'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-226"></a> <span class='hs-keyword'>where</span>
<a name="line-227"></a>  <span class='hs-varid'>gath</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-conid'>Get</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Get</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>gath</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-varop'>.</span><span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-228"></a>  <span class='hs-varid'>gath</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Fail</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span>
<a name="line-229"></a>  <span class='hs-varid'>gath</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-conid'>Look</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>gath</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-230"></a>  <span class='hs-varid'>gath</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-varid'>k</span> <span class='hs-varid'>p</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-varid'>l</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>gath</span> <span class='hs-varid'>l</span> <span class='hs-varid'>p</span>
<a name="line-231"></a>  <span class='hs-varid'>gath</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Final</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'>"do not use readS_to_P in gather!"</span>
<a name="line-232"></a>
<a name="line-233"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-234"></a><span class='hs-comment'>-- Derived operations</span>
<a name="line-235"></a>
<a name="line-236"></a><a name="satisfy"></a><span class='hs-definition'>satisfy</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>Char</span>
<a name="line-237"></a><span class='hs-comment'>-- ^ Consumes and returns the next character, if it satisfies the</span>
<a name="line-238"></a><span class='hs-comment'>--   specified predicate.</span>
<a name="line-239"></a><span class='hs-definition'>satisfy</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span><span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>pfail</span>
<a name="line-240"></a>
<a name="line-241"></a><a name="char"></a><span class='hs-definition'>char</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>Char</span>
<a name="line-242"></a><span class='hs-comment'>-- ^ Parses and returns the specified character.</span>
<a name="line-243"></a><span class='hs-definition'>char</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>satisfy</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span> <span class='hs-varop'>==</span><span class='hs-layout'>)</span>
<a name="line-244"></a>
<a name="line-245"></a><a name="string"></a><span class='hs-definition'>string</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>String</span>
<a name="line-246"></a><span class='hs-comment'>-- ^ Parses and returns the specified string.</span>
<a name="line-247"></a><span class='hs-definition'>string</span> <span class='hs-varid'>this</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>look</span><span class='hs-layout'>;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>this</span> <span class='hs-varid'>s</span>
<a name="line-248"></a> <span class='hs-keyword'>where</span>
<a name="line-249"></a>  <span class='hs-varid'>scan</span> <span class='hs-conid'>[]</span>     <span class='hs-keyword'>_</span>               <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>return</span> <span class='hs-varid'>this</span>
<a name="line-250"></a>  <span class='hs-varid'>scan</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>get</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ys</span>
<a name="line-251"></a>  <span class='hs-varid'>scan</span> <span class='hs-keyword'>_</span>      <span class='hs-keyword'>_</span>               <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>pfail</span>
<a name="line-252"></a>
<a name="line-253"></a><a name="munch"></a><span class='hs-definition'>munch</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>String</span>
<a name="line-254"></a><span class='hs-comment'>-- ^ Parses the first zero or more characters satisfying the predicate.</span>
<a name="line-255"></a><span class='hs-definition'>munch</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span>
<a name="line-256"></a>  <span class='hs-keyword'>do</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>look</span>
<a name="line-257"></a>     <span class='hs-varid'>scan</span> <span class='hs-varid'>s</span>
<a name="line-258"></a> <span class='hs-keyword'>where</span>
<a name="line-259"></a>  <span class='hs-varid'>scan</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>cs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span><span class='hs-layout'>;</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>scan</span> <span class='hs-varid'>cs</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-260"></a>  <span class='hs-varid'>scan</span> <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>return</span> <span class='hs-str'>""</span>
<a name="line-261"></a>
<a name="line-262"></a><a name="munch1"></a><span class='hs-definition'>munch1</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>String</span>
<a name="line-263"></a><span class='hs-comment'>-- ^ Parses the first one or more characters satisfying the predicate.</span>
<a name="line-264"></a><span class='hs-definition'>munch1</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span>
<a name="line-265"></a>  <span class='hs-keyword'>do</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span>
<a name="line-266"></a>     <span class='hs-keyword'>if</span> <span class='hs-varid'>p</span> <span class='hs-varid'>c</span> <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>munch</span> <span class='hs-varid'>p</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-267"></a>            <span class='hs-keyword'>else</span> <span class='hs-varid'>pfail</span>
<a name="line-268"></a>
<a name="line-269"></a><a name="choice"></a><span class='hs-definition'>choice</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-270"></a><span class='hs-comment'>-- ^ Combines all parsers in the specified list.</span>
<a name="line-271"></a><span class='hs-definition'>choice</span> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pfail</span>
<a name="line-272"></a><span class='hs-definition'>choice</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>p</span><span class='hs-keyglyph'>]</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span>
<a name="line-273"></a><span class='hs-definition'>choice</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-conop'>:</span><span class='hs-varid'>ps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span> <span class='hs-varop'>+++</span> <span class='hs-varid'>choice</span> <span class='hs-varid'>ps</span>
<a name="line-274"></a>
<a name="line-275"></a><a name="skipSpaces"></a><span class='hs-definition'>skipSpaces</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>()</span>
<a name="line-276"></a><span class='hs-comment'>-- ^ Skips all whitespace.</span>
<a name="line-277"></a><span class='hs-definition'>skipSpaces</span> <span class='hs-keyglyph'>=</span>
<a name="line-278"></a>  <span class='hs-keyword'>do</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>look</span>
<a name="line-279"></a>     <span class='hs-varid'>skip</span> <span class='hs-varid'>s</span>
<a name="line-280"></a> <span class='hs-keyword'>where</span>
<a name="line-281"></a>  <span class='hs-varid'>skip</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isSpace</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span><span class='hs-layout'>;</span> <span class='hs-varid'>skip</span> <span class='hs-varid'>s</span>
<a name="line-282"></a>  <span class='hs-varid'>skip</span> <span class='hs-keyword'>_</span>                 <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-283"></a>
<a name="line-284"></a><a name="count"></a><span class='hs-definition'>count</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-285"></a><span class='hs-comment'>-- ^ @ count n p @ parses @n@ occurrences of @p@ in sequence. A list of</span>
<a name="line-286"></a><span class='hs-comment'>--   results is returned.</span>
<a name="line-287"></a><span class='hs-definition'>count</span> <span class='hs-varid'>n</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sequence</span> <span class='hs-layout'>(</span><span class='hs-varid'>replicate</span> <span class='hs-varid'>n</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-288"></a>
<a name="line-289"></a><a name="between"></a><span class='hs-definition'>between</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>open</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>close</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-290"></a><span class='hs-comment'>-- ^ @ between open close p @ parses @open@, followed by @p@ and finally</span>
<a name="line-291"></a><span class='hs-comment'>--   @close@. Only the value of @p@ is returned.</span>
<a name="line-292"></a><span class='hs-definition'>between</span> <span class='hs-varid'>open</span> <span class='hs-varid'>close</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>open</span>
<a name="line-293"></a>                          <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span>
<a name="line-294"></a>                          <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>close</span>
<a name="line-295"></a>                          <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-296"></a>
<a name="line-297"></a><a name="option"></a><span class='hs-definition'>option</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-298"></a><span class='hs-comment'>-- ^ @option x p@ will either parse @p@ or return @x@ without consuming</span>
<a name="line-299"></a><span class='hs-comment'>--   any input.</span>
<a name="line-300"></a><span class='hs-definition'>option</span> <span class='hs-varid'>x</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span> <span class='hs-varop'>+++</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-301"></a>
<a name="line-302"></a><a name="optional"></a><span class='hs-definition'>optional</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>()</span>
<a name="line-303"></a><span class='hs-comment'>-- ^ @optional p@ optionally parses @p@ and always returns @()@.</span>
<a name="line-304"></a><span class='hs-definition'>optional</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-varop'>+++</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-305"></a>
<a name="line-306"></a><a name="many"></a><span class='hs-definition'>many</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-307"></a><span class='hs-comment'>-- ^ Parses zero or more occurrences of the given parser.</span>
<a name="line-308"></a><span class='hs-definition'>many</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>+++</span> <span class='hs-varid'>many1</span> <span class='hs-varid'>p</span>
<a name="line-309"></a>
<a name="line-310"></a><a name="many1"></a><span class='hs-definition'>many1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-311"></a><span class='hs-comment'>-- ^ Parses one or more occurrences of the given parser.</span>
<a name="line-312"></a><span class='hs-definition'>many1</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM2</span> <span class='hs-layout'>(</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>many</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-313"></a>
<a name="line-314"></a><a name="skipMany"></a><span class='hs-definition'>skipMany</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>()</span>
<a name="line-315"></a><span class='hs-comment'>-- ^ Like 'many', but discards the result.</span>
<a name="line-316"></a><span class='hs-definition'>skipMany</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>many</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-317"></a>
<a name="line-318"></a><a name="skipMany1"></a><span class='hs-definition'>skipMany1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-conid'>()</span>
<a name="line-319"></a><span class='hs-comment'>-- ^ Like 'many1', but discards the result.</span>
<a name="line-320"></a><span class='hs-definition'>skipMany1</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>skipMany</span> <span class='hs-varid'>p</span>
<a name="line-321"></a>
<a name="line-322"></a><a name="sepBy"></a><span class='hs-definition'>sepBy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-323"></a><span class='hs-comment'>-- ^ @sepBy p sep@ parses zero or more occurrences of @p@, separated by @sep@.</span>
<a name="line-324"></a><span class='hs-comment'>--   Returns a list of values returned by @p@.</span>
<a name="line-325"></a><span class='hs-definition'>sepBy</span> <span class='hs-varid'>p</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sepBy1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>sep</span> <span class='hs-varop'>+++</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-326"></a>
<a name="line-327"></a><a name="sepBy1"></a><span class='hs-definition'>sepBy1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-328"></a><span class='hs-comment'>-- ^ @sepBy1 p sep@ parses one or more occurrences of @p@, separated by @sep@.</span>
<a name="line-329"></a><span class='hs-comment'>--   Returns a list of values returned by @p@.</span>
<a name="line-330"></a><span class='hs-definition'>sepBy1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM2</span> <span class='hs-layout'>(</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>many</span> <span class='hs-layout'>(</span><span class='hs-varid'>sep</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-331"></a>
<a name="line-332"></a><a name="endBy"></a><span class='hs-definition'>endBy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-333"></a><span class='hs-comment'>-- ^ @endBy p sep@ parses zero or more occurrences of @p@, separated and ended</span>
<a name="line-334"></a><span class='hs-comment'>--   by @sep@.</span>
<a name="line-335"></a><span class='hs-definition'>endBy</span> <span class='hs-varid'>p</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>many</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span> <span class='hs-layout'>;</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>sep</span> <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-336"></a>
<a name="line-337"></a><a name="endBy1"></a><span class='hs-definition'>endBy1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-338"></a><span class='hs-comment'>-- ^ @endBy p sep@ parses one or more occurrences of @p@, separated and ended</span>
<a name="line-339"></a><span class='hs-comment'>--   by @sep@.</span>
<a name="line-340"></a><span class='hs-definition'>endBy1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>many1</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span> <span class='hs-layout'>;</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>sep</span> <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-341"></a>
<a name="line-342"></a><a name="chainr"></a><span class='hs-definition'>chainr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-343"></a><span class='hs-comment'>-- ^ @chainr p op x@ parses zero or more occurrences of @p@, separated by @op@.</span>
<a name="line-344"></a><span class='hs-comment'>--   Returns a value produced by a /right/ associative application of all</span>
<a name="line-345"></a><span class='hs-comment'>--   functions returned by @op@. If there are no occurrences of @p@, @x@ is</span>
<a name="line-346"></a><span class='hs-comment'>--   returned.</span>
<a name="line-347"></a><span class='hs-definition'>chainr</span> <span class='hs-varid'>p</span> <span class='hs-varid'>op</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>chainr1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>op</span> <span class='hs-varop'>+++</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-348"></a>
<a name="line-349"></a><a name="chainl"></a><span class='hs-definition'>chainl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-350"></a><span class='hs-comment'>-- ^ @chainl p op x@ parses zero or more occurrences of @p@, separated by @op@.</span>
<a name="line-351"></a><span class='hs-comment'>--   Returns a value produced by a /left/ associative application of all</span>
<a name="line-352"></a><span class='hs-comment'>--   functions returned by @op@. If there are no occurrences of @p@, @x@ is</span>
<a name="line-353"></a><span class='hs-comment'>--   returned.</span>
<a name="line-354"></a><span class='hs-definition'>chainl</span> <span class='hs-varid'>p</span> <span class='hs-varid'>op</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>chainl1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>op</span> <span class='hs-varop'>+++</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-355"></a>
<a name="line-356"></a><a name="chainr1"></a><span class='hs-definition'>chainr1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-357"></a><span class='hs-comment'>-- ^ Like 'chainr', but parses one or more occurrences of @p@.</span>
<a name="line-358"></a><span class='hs-definition'>chainr1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>op</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>scan</span>
<a name="line-359"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>scan</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>rest</span>
<a name="line-360"></a>        <span class='hs-varid'>rest</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>op</span>
<a name="line-361"></a>                    <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>scan</span>
<a name="line-362"></a>                    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-363"></a>                 <span class='hs-varop'>+++</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-364"></a>
<a name="line-365"></a><a name="chainl1"></a><span class='hs-definition'>chainl1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-366"></a><span class='hs-comment'>-- ^ Like 'chainl', but parses one or more occurrences of @p@.</span>
<a name="line-367"></a><span class='hs-definition'>chainl1</span> <span class='hs-varid'>p</span> <span class='hs-varid'>op</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>rest</span>
<a name="line-368"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>rest</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>op</span>
<a name="line-369"></a>                    <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span>
<a name="line-370"></a>                    <span class='hs-varid'>rest</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span>
<a name="line-371"></a>                 <span class='hs-varop'>+++</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-372"></a>
<a name="line-373"></a><a name="manyTill"></a><span class='hs-definition'>manyTill</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>end</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-374"></a><span class='hs-comment'>-- ^ @manyTill p end@ parses zero or more occurrences of @p@, until @end@</span>
<a name="line-375"></a><span class='hs-comment'>--   succeeds. Returns a list of values returned by @p@.</span>
<a name="line-376"></a><span class='hs-definition'>manyTill</span> <span class='hs-varid'>p</span> <span class='hs-varid'>end</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>scan</span>
<a name="line-377"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>scan</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>end</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;++</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftM2</span> <span class='hs-layout'>(</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-varid'>p</span> <span class='hs-varid'>scan</span><span class='hs-layout'>)</span>
<a name="line-378"></a>
<a name="line-379"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-380"></a><span class='hs-comment'>-- Converting between ReadP and Read</span>
<a name="line-381"></a>
<a name="line-382"></a><a name="readP_to_S"></a><span class='hs-definition'>readP_to_S</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>a</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadS</span> <span class='hs-varid'>a</span>
<a name="line-383"></a><span class='hs-comment'>-- ^ Converts a parser into a Haskell ReadS-style function.</span>
<a name="line-384"></a><span class='hs-comment'>--   This is the main way in which you can \"run\" a 'ReadP' parser:</span>
<a name="line-385"></a><span class='hs-comment'>--   the expanded type is</span>
<a name="line-386"></a><span class='hs-comment'>-- @ readP_to_S :: ReadP a -&gt; String -&gt; [(a,String)] @</span>
<a name="line-387"></a><span class='hs-definition'>readP_to_S</span> <span class='hs-layout'>(</span><span class='hs-conid'>R</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>run</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>return</span><span class='hs-layout'>)</span>
<a name="line-388"></a>
<a name="line-389"></a><a name="readS_to_P"></a><span class='hs-definition'>readS_to_P</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ReadS</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ReadP</span> <span class='hs-varid'>r</span> <span class='hs-varid'>a</span>
<a name="line-390"></a><span class='hs-comment'>-- ^ Converts a Haskell ReadS-style function into a parser.</span>
<a name="line-391"></a><span class='hs-comment'>--   Warning: This introduces local backtracking in the resulting</span>
<a name="line-392"></a><span class='hs-comment'>--   parser, and therefore a possible inefficiency.</span>
<a name="line-393"></a><span class='hs-definition'>readS_to_P</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span>
<a name="line-394"></a>  <span class='hs-conid'>R</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Look</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>final</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>bs''</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>s'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs''</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-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>s'</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre></body>
</html>