This file is indexed.

/usr/share/doc/libghc-attoparsec-doc/html/src/Data-Attoparsec-Zepto.html is in libghc-attoparsec-doc 0.13.1.0-3build6.

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
<?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>Data/Attoparsec/Zepto.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE CPP #-}</span>
<a name="line-2"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ &gt;= 702</span>
<a name="line-3"></a><span class='hs-comment'>{-# LANGUAGE Trustworthy #-}</span> <span class='hs-comment'>-- Data.ByteString.Unsafe</span>
<a name="line-4"></a><span class='hs-cpp'>#endif</span>
<a name="line-5"></a><span class='hs-comment'>{-# LANGUAGE BangPatterns #-}</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-comment'>-- |</span>
<a name="line-8"></a><span class='hs-comment'>-- Module      :  Data.Attoparsec.Zepto</span>
<a name="line-9"></a><span class='hs-comment'>-- Copyright   :  Bryan O'Sullivan 2007-2015</span>
<a name="line-10"></a><span class='hs-comment'>-- License     :  BSD3</span>
<a name="line-11"></a><span class='hs-comment'>--</span>
<a name="line-12"></a><span class='hs-comment'>-- Maintainer  :  bos@serpentine.com</span>
<a name="line-13"></a><span class='hs-comment'>-- Stability   :  experimental</span>
<a name="line-14"></a><span class='hs-comment'>-- Portability :  unknown</span>
<a name="line-15"></a><span class='hs-comment'>--</span>
<a name="line-16"></a><span class='hs-comment'>-- A tiny, highly specialized combinator parser for 'B.ByteString'</span>
<a name="line-17"></a><span class='hs-comment'>-- strings.</span>
<a name="line-18"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><span class='hs-comment'>-- While the main attoparsec module generally performs well, this</span>
<a name="line-20"></a><span class='hs-comment'>-- module is particularly fast for simple non-recursive loops that</span>
<a name="line-21"></a><span class='hs-comment'>-- should not normally result in failed parses.</span>
<a name="line-22"></a><span class='hs-comment'>--</span>
<a name="line-23"></a><span class='hs-comment'>-- /Warning/: on more complex inputs involving recursion or failure,</span>
<a name="line-24"></a><span class='hs-comment'>-- parsers based on this module may be as much as /ten times slower/</span>
<a name="line-25"></a><span class='hs-comment'>-- than regular attoparsec! You should /only/ use this module when you</span>
<a name="line-26"></a><span class='hs-comment'>-- have benchmarks that prove that its use speeds your code up.</span>
<a name="line-27"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Attoparsec</span><span class='hs-varop'>.</span><span class='hs-conid'>Zepto</span>
<a name="line-28"></a>    <span class='hs-layout'>(</span>
<a name="line-29"></a>      <span class='hs-conid'>Parser</span>
<a name="line-30"></a>    <span class='hs-layout'>,</span> <span class='hs-conid'>ZeptoT</span>
<a name="line-31"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>parse</span>
<a name="line-32"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>parseT</span>
<a name="line-33"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>atEnd</span>
<a name="line-34"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>string</span>
<a name="line-35"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>take</span>
<a name="line-36"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>takeWhile</span>
<a name="line-37"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span>
<a name="line-40"></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'>ap</span><span class='hs-layout'>)</span>
<a name="line-41"></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-varop'>.</span><span class='hs-conid'>Fail</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Fail</span>
<a name="line-42"></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-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-layout'>(</span><span class='hs-conid'>ByteString</span><span class='hs-layout'>)</span>
<a name="line-44"></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><span class='hs-layout'>)</span>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Mon</span> <span class='hs-layout'>(</span><span class='hs-conid'>Monoid</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Semigroup</span> <span class='hs-layout'>(</span><span class='hs-conid'>Semigroup</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Word</span> <span class='hs-layout'>(</span><span class='hs-conid'>Word8</span><span class='hs-layout'>)</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>take</span><span class='hs-layout'>,</span> <span class='hs-varid'>takeWhile</span><span class='hs-layout'>)</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>B</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Unsafe</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>B</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="S"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>S</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span> <span class='hs-layout'>{</span>
<a name="line-53"></a>      <span class='hs-varid'>input</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ByteString</span>
<a name="line-54"></a>    <span class='hs-layout'>}</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="Result"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Result</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span> <span class='hs-conid'>String</span>
<a name="line-57"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OK</span> <span class='hs-varop'>!</span><span class='hs-varid'>a</span> <span class='hs-conid'>S</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="ZeptoT"></a><span class='hs-comment'>-- | A simple parser.</span>
<a name="line-60"></a><a name="ZeptoT"></a><span class='hs-comment'>--</span>
<a name="line-61"></a><a name="ZeptoT"></a><span class='hs-comment'>-- This monad is strict in its state, and the monadic bind operator</span>
<a name="line-62"></a><a name="ZeptoT"></a><span class='hs-comment'>-- ('&gt;&gt;=') evaluates each result to weak head normal form before</span>
<a name="line-63"></a><a name="ZeptoT"></a><span class='hs-comment'>-- passing it along.</span>
<a name="line-64"></a><a name="ZeptoT"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</span> <span class='hs-layout'>{</span>
<a name="line-65"></a>      <span class='hs-varid'>runParser</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-66"></a>    <span class='hs-layout'>}</span>
<a name="line-67"></a>
<a name="line-68"></a><a name="Parser"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Parser</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ZeptoT</span> <span class='hs-conid'>Identity</span> <span class='hs-varid'>a</span>
<a name="line-69"></a>
<a name="line-70"></a><a name="instance%20Functor%20(ZeptoT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-71"></a>    <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</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'>do</span>
<a name="line-72"></a>      <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runParser</span> <span class='hs-varid'>m</span> <span class='hs-varid'>s</span>
<a name="line-73"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>result</span> <span class='hs-keyword'>of</span>
<a name="line-74"></a>        <span class='hs-conid'>OK</span> <span class='hs-varid'>a</span> <span class='hs-varid'>s'</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>OK</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>s'</span><span class='hs-layout'>)</span>
<a name="line-75"></a>        <span class='hs-conid'>Fail</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'>Fail</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-76"></a>    <span class='hs-comment'>{-# INLINE fmap #-}</span>
<a name="line-77"></a>
<a name="line-78"></a><a name="instance%20MonadIO%20(ZeptoT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadIO</span> <span class='hs-layout'>(</span><span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-79"></a>  <span class='hs-varid'>liftIO</span> <span class='hs-varid'>act</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</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'>do</span>
<a name="line-80"></a>    <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>liftIO</span> <span class='hs-varid'>act</span>
<a name="line-81"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>OK</span> <span class='hs-varid'>result</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-82"></a>  <span class='hs-comment'>{-# INLINE liftIO #-}</span>
<a name="line-83"></a>
<a name="line-84"></a><a name="instance%20Monad%20(ZeptoT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-85"></a>    <span class='hs-varid'>return</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pure</span>
<a name="line-86"></a>    <span class='hs-comment'>{-# INLINE return #-}</span>
<a name="line-87"></a>
<a name="line-88"></a>    <span class='hs-varid'>m</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</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'>do</span>
<a name="line-89"></a>      <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runParser</span> <span class='hs-varid'>m</span> <span class='hs-varid'>s</span>
<a name="line-90"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>result</span> <span class='hs-keyword'>of</span>
<a name="line-91"></a>        <span class='hs-conid'>OK</span> <span class='hs-varid'>a</span> <span class='hs-varid'>s'</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>runParser</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>
<a name="line-92"></a>        <span class='hs-conid'>Fail</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'>Fail</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-93"></a>    <span class='hs-comment'>{-# INLINE (&gt;&gt;=) #-}</span>
<a name="line-94"></a>
<a name="line-95"></a>    <span class='hs-varid'>fail</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Fail</span><span class='hs-varop'>.</span><span class='hs-varid'>fail</span>
<a name="line-96"></a>    <span class='hs-comment'>{-# INLINE fail #-}</span>
<a name="line-97"></a>
<a name="line-98"></a><a name="instance%20Fail.MonadFail%20(ZeptoT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Fail</span><span class='hs-varop'>.</span><span class='hs-conid'>MonadFail</span> <span class='hs-layout'>(</span><span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-99"></a>    <span class='hs-varid'>fail</span> <span class='hs-varid'>msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Fail</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span>
<a name="line-100"></a>    <span class='hs-comment'>{-# INLINE fail #-}</span>
<a name="line-101"></a>
<a name="line-102"></a><a name="instance%20MonadPlus%20(ZeptoT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadPlus</span> <span class='hs-layout'>(</span><span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-103"></a>    <span class='hs-varid'>mzero</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"mzero"</span>
<a name="line-104"></a>    <span class='hs-comment'>{-# INLINE mzero #-}</span>
<a name="line-105"></a>
<a name="line-106"></a>    <span class='hs-varid'>mplus</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</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'>do</span>
<a name="line-107"></a>      <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runParser</span> <span class='hs-varid'>a</span> <span class='hs-varid'>s</span>
<a name="line-108"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>result</span> <span class='hs-keyword'>of</span>
<a name="line-109"></a>        <span class='hs-varid'>ok</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>OK</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>ok</span>
<a name="line-110"></a>        <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>runParser</span> <span class='hs-varid'>b</span> <span class='hs-varid'>s</span>
<a name="line-111"></a>    <span class='hs-comment'>{-# INLINE mplus #-}</span>
<a name="line-112"></a>
<a name="line-113"></a><a name="instance%20Applicative%20(ZeptoT%20m)"></a><span class='hs-keyword'>instance</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-keyglyph'>=&gt;</span> <span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-114"></a>    <span class='hs-varid'>pure</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</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-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>OK</span> <span class='hs-varid'>a</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-115"></a>    <span class='hs-comment'>{-# INLINE pure #-}</span>
<a name="line-116"></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-117"></a>    <span class='hs-comment'>{-# INLINE (&lt;*&gt;) #-}</span>
<a name="line-118"></a>
<a name="line-119"></a><a name="gets"></a><span class='hs-definition'>gets</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</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'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-120"></a><span class='hs-definition'>gets</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</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-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>OK</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>
<a name="line-121"></a><span class='hs-comment'>{-# INLINE gets #-}</span>
<a name="line-122"></a>
<a name="line-123"></a><a name="put"></a><span class='hs-definition'>put</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'>S</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-124"></a><span class='hs-definition'>put</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Parser</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>OK</span> <span class='hs-conid'>()</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-125"></a><span class='hs-comment'>{-# INLINE put #-}</span>
<a name="line-126"></a>
<a name="line-127"></a><a name="parse"></a><span class='hs-comment'>-- | Run a parser.</span>
<a name="line-128"></a><span class='hs-definition'>parse</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Parser</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>String</span> <span class='hs-varid'>a</span>
<a name="line-129"></a><span class='hs-definition'>parse</span> <span class='hs-varid'>p</span> <span class='hs-varid'>bs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>runIdentity</span> <span class='hs-layout'>(</span><span class='hs-varid'>runParser</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span> <span class='hs-varid'>bs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-130"></a>               <span class='hs-layout'>(</span><span class='hs-conid'>OK</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Right</span> <span class='hs-varid'>a</span>
<a name="line-131"></a>               <span class='hs-layout'>(</span><span class='hs-conid'>Fail</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span>
<a name="line-132"></a><span class='hs-comment'>{-# INLINE parse #-}</span>
<a name="line-133"></a>
<a name="line-134"></a><a name="parseT"></a><span class='hs-comment'>-- | Run a parser on top of the given base monad.</span>
<a name="line-135"></a><span class='hs-definition'>parseT</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'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ByteString</span> <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'>String</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-136"></a><span class='hs-definition'>parseT</span> <span class='hs-varid'>p</span> <span class='hs-varid'>bs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-137"></a>  <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runParser</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span> <span class='hs-varid'>bs</span><span class='hs-layout'>)</span>
<a name="line-138"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>result</span> <span class='hs-keyword'>of</span>
<a name="line-139"></a>    <span class='hs-conid'>OK</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-140"></a>    <span class='hs-conid'>Fail</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'>Left</span> <span class='hs-varid'>err</span><span class='hs-layout'>)</span>
<a name="line-141"></a><span class='hs-comment'>{-# INLINE parseT #-}</span>
<a name="line-142"></a>
<a name="line-143"></a><a name="instance%20Semigroup%20(ZeptoT%20m%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Semigroup</span> <span class='hs-layout'>(</span><span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-144"></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-145"></a>    <span class='hs-comment'>{-# INLINE (&lt;&gt;) #-}</span>
<a name="line-146"></a>
<a name="line-147"></a><a name="instance%20Mon.Monoid%20(ZeptoT%20m%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Mon</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-148"></a>    <span class='hs-varid'>mempty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"mempty"</span>
<a name="line-149"></a>    <span class='hs-comment'>{-# INLINE mempty #-}</span>
<a name="line-150"></a>    <span class='hs-varid'>mappend</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;&gt;</span><span class='hs-layout'>)</span>
<a name="line-151"></a>    <span class='hs-comment'>{-# INLINE mappend #-}</span>
<a name="line-152"></a>
<a name="line-153"></a><a name="instance%20Alternative%20(ZeptoT%20m)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Alternative</span> <span class='hs-layout'>(</span><span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-154"></a>    <span class='hs-varid'>empty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"empty"</span>
<a name="line-155"></a>    <span class='hs-comment'>{-# INLINE empty #-}</span>
<a name="line-156"></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-157"></a>    <span class='hs-comment'>{-# INLINE (&lt;|&gt;) #-}</span>
<a name="line-158"></a>
<a name="line-159"></a><a name="takeWhile"></a><span class='hs-comment'>-- | Consume input while the predicate returns 'True'.</span>
<a name="line-160"></a><span class='hs-definition'>takeWhile</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Word8</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'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-conid'>ByteString</span>
<a name="line-161"></a><span class='hs-definition'>takeWhile</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-162"></a>  <span class='hs-layout'>(</span><span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>gets</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>span</span> <span class='hs-varid'>p</span> <span class='hs-varop'>.</span> <span class='hs-varid'>input</span><span class='hs-layout'>)</span>
<a name="line-163"></a>  <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-164"></a>  <span class='hs-varid'>return</span> <span class='hs-varid'>h</span>
<a name="line-165"></a><span class='hs-comment'>{-# INLINE takeWhile #-}</span>
<a name="line-166"></a>
<a name="line-167"></a><a name="take"></a><span class='hs-comment'>-- | Consume @n@ bytes of input.</span>
<a name="line-168"></a><span class='hs-definition'>take</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'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-conid'>ByteString</span>
<a name="line-169"></a><a name="!"></a><span class='hs-definition'>take</span> <span class='hs-varop'>!</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-170"></a>  <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>gets</span> <span class='hs-varid'>input</span>
<a name="line-171"></a>  <span class='hs-keyword'>if</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>length</span> <span class='hs-varid'>s</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>n</span>
<a name="line-172"></a>    <span class='hs-keyword'>then</span> <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeDrop</span> <span class='hs-varid'>n</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeTake</span> <span class='hs-varid'>n</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-173"></a>    <span class='hs-keyword'>else</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"insufficient input"</span>
<a name="line-174"></a><span class='hs-comment'>{-# INLINE take #-}</span>
<a name="line-175"></a>
<a name="line-176"></a><a name="string"></a><span class='hs-comment'>-- | Match a string exactly.</span>
<a name="line-177"></a><span class='hs-definition'>string</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'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-178"></a><span class='hs-definition'>string</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-179"></a>  <span class='hs-varid'>i</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>gets</span> <span class='hs-varid'>input</span>
<a name="line-180"></a>  <span class='hs-keyword'>if</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>isPrefixOf</span><span class='hs-varop'>`</span> <span class='hs-varid'>i</span>
<a name="line-181"></a>    <span class='hs-keyword'>then</span> <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeDrop</span> <span class='hs-layout'>(</span><span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>length</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-182"></a>    <span class='hs-keyword'>else</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"string"</span>
<a name="line-183"></a><span class='hs-comment'>{-# INLINE string #-}</span>
<a name="line-184"></a>
<a name="line-185"></a><a name="atEnd"></a><span class='hs-comment'>-- | Indicate whether the end of the input has been reached.</span>
<a name="line-186"></a><span class='hs-definition'>atEnd</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'>ZeptoT</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Bool</span>
<a name="line-187"></a><span class='hs-definition'>atEnd</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-188"></a>  <span class='hs-varid'>i</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>gets</span> <span class='hs-varid'>input</span>
<a name="line-189"></a>  <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>B</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span> <span class='hs-varid'>i</span>
<a name="line-190"></a><span class='hs-comment'>{-# INLINE atEnd #-}</span>
</pre></body>
</html>