/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__ >= 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'>-- ('>>=') 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'>-></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'>=></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'>-></span> <span class='hs-keyword'>do</span>
<a name="line-72"></a> <span class='hs-varid'>result</span> <span class='hs-keyglyph'><-</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'>-></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'>-></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'>=></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'>-></span> <span class='hs-keyword'>do</span>
<a name="line-80"></a> <span class='hs-varid'>result</span> <span class='hs-keyglyph'><-</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'>=></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'>>>=</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'>-></span> <span class='hs-keyword'>do</span>
<a name="line-89"></a> <span class='hs-varid'>result</span> <span class='hs-keyglyph'><-</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'>-></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'>-></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 (>>=) #-}</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'>=></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'>-></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'>=></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'>-></span> <span class='hs-keyword'>do</span>
<a name="line-107"></a> <span class='hs-varid'>result</span> <span class='hs-keyglyph'><-</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'>-></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'>-></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'>=></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'>-></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'><*></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 (<*>) #-}</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'>=></span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></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'>-></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'>=></span> <span class='hs-conid'>S</span> <span class='hs-keyglyph'>-></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'>-></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'>-></span> <span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>=></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'>ByteString</span> <span class='hs-keyglyph'>-></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'><-</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'>-></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'>-></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'>=></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'><></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 (<>) #-}</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'>=></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'><></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'>=></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'><|></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 (<|>) #-}</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'>=></span> <span class='hs-layout'>(</span><span class='hs-conid'>Word8</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></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'><-</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'>=></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></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'><-</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'>>=</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'>>></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'>=></span> <span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-></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'><-</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'>>></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'>=></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'><-</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>
|