This file is indexed.

/usr/share/doc/libghc-text-doc/html/src/Data-Text-Read.html is in libghc-text-doc 0.11.1.13-1build1.

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
<?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/Text/Read.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE OverloadedStrings, UnboxedTuples #-}</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-comment'>-- |</span>
<a name="line-4"></a><span class='hs-comment'>-- Module      : Data.Text.Read</span>
<a name="line-5"></a><span class='hs-comment'>-- Copyright   : (c) 2010, 2011 Bryan O'Sullivan</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- License     : BSD-style</span>
<a name="line-8"></a><span class='hs-comment'>-- Maintainer  : bos@serpentine.com</span>
<a name="line-9"></a><span class='hs-comment'>-- Stability   : experimental</span>
<a name="line-10"></a><span class='hs-comment'>-- Portability : GHC</span>
<a name="line-11"></a><span class='hs-comment'>--</span>
<a name="line-12"></a><span class='hs-comment'>-- Functions used frequently when reading textual data.</span>
<a name="line-13"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Read</span>
<a name="line-14"></a>    <span class='hs-layout'>(</span>
<a name="line-15"></a>      <span class='hs-conid'>Reader</span>
<a name="line-16"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>decimal</span>
<a name="line-17"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>hexadecimal</span>
<a name="line-18"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>signed</span>
<a name="line-19"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>rational</span>
<a name="line-20"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>double</span>
<a name="line-21"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-22"></a>
<a name="line-23"></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-varid'>liftM</span><span class='hs-layout'>)</span>
<a name="line-24"></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'>isDigit</span><span class='hs-layout'>,</span> <span class='hs-varid'>isHexDigit</span><span class='hs-layout'>,</span> <span class='hs-varid'>ord</span><span class='hs-layout'>)</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Int</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int8</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int16</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int32</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int64</span><span class='hs-layout'>)</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Ratio</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>%</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>T</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Private</span> <span class='hs-layout'>(</span><span class='hs-varid'>span_</span><span class='hs-layout'>)</span>
<a name="line-29"></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'>Word</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word8</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word16</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word64</span><span class='hs-layout'>)</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="Reader"></a><span class='hs-comment'>-- | Read some text.  If the read succeeds, return its value and the</span>
<a name="line-32"></a><a name="Reader"></a><span class='hs-comment'>-- remaining text, otherwise an error message.</span>
<a name="line-33"></a><a name="Reader"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Reader</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Text</span><span class='hs-layout'>)</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="decimal"></a><span class='hs-comment'>-- | Read a decimal integer.  The input must begin with at least one</span>
<a name="line-36"></a><span class='hs-comment'>-- decimal digit, and is consumed until a non-digit or end of string</span>
<a name="line-37"></a><span class='hs-comment'>-- is reached.</span>
<a name="line-38"></a><span class='hs-comment'>--</span>
<a name="line-39"></a><span class='hs-comment'>-- This function does not handle leading sign characters.  If you need</span>
<a name="line-40"></a><span class='hs-comment'>-- to handle signed input, use @'signed' 'decimal'@.</span>
<a name="line-41"></a><span class='hs-comment'>--</span>
<a name="line-42"></a><span class='hs-comment'>-- /Note/: For fixed-width integer types, this function does not</span>
<a name="line-43"></a><span class='hs-comment'>-- attempt to detect overflow, so a sufficiently long input may give</span>
<a name="line-44"></a><span class='hs-comment'>-- incorrect results.  If you are worried about overflow, use</span>
<a name="line-45"></a><span class='hs-comment'>-- 'Integer' for your result type.</span>
<a name="line-46"></a><span class='hs-definition'>decimal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integral</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Reader</span> <span class='hs-varid'>a</span>
<a name="line-47"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Int #-}</span>
<a name="line-48"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Int8 #-}</span>
<a name="line-49"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Int16 #-}</span>
<a name="line-50"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Int32 #-}</span>
<a name="line-51"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Int64 #-}</span>
<a name="line-52"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Integer #-}</span>
<a name="line-53"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Word #-}</span>
<a name="line-54"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Word8 #-}</span>
<a name="line-55"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Word16 #-}</span>
<a name="line-56"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Word32 #-}</span>
<a name="line-57"></a><span class='hs-comment'>{-# SPECIALIZE decimal :: Reader Word64 #-}</span>
<a name="line-58"></a><span class='hs-definition'>decimal</span> <span class='hs-varid'>txt</span>
<a name="line-59"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span> <span class='hs-varid'>h</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Left</span> <span class='hs-str'>"input does not start with a digit"</span>
<a name="line-60"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>foldl'</span> <span class='hs-varid'>go</span> <span class='hs-num'>0</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-61"></a>  <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-cpp'>#</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>t</span> <span class='hs-cpp'>#</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>span_</span> <span class='hs-varid'>isDigit</span> <span class='hs-varid'>txt</span>
<a name="line-62"></a>        <span class='hs-varid'>go</span> <span class='hs-varid'>n</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span> <span class='hs-varop'>*</span> <span class='hs-num'>10</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>digitToInt</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-63"></a>
<a name="line-64"></a><a name="hexadecimal"></a><span class='hs-comment'>-- | Read a hexadecimal integer, consisting of an optional leading</span>
<a name="line-65"></a><span class='hs-comment'>-- @\"0x\"@ followed by at least one decimal digit. Input is consumed</span>
<a name="line-66"></a><span class='hs-comment'>-- until a non-hex-digit or end of string is reached.  This function</span>
<a name="line-67"></a><span class='hs-comment'>-- is case insensitive.</span>
<a name="line-68"></a><span class='hs-comment'>--</span>
<a name="line-69"></a><span class='hs-comment'>-- This function does not handle leading sign characters.  If you need</span>
<a name="line-70"></a><span class='hs-comment'>-- to handle signed input, use @'signed' 'hexadecimal'@.</span>
<a name="line-71"></a><span class='hs-comment'>--</span>
<a name="line-72"></a><span class='hs-comment'>-- /Note/: For fixed-width integer types, this function does not</span>
<a name="line-73"></a><span class='hs-comment'>-- attempt to detect overflow, so a sufficiently long input may give</span>
<a name="line-74"></a><span class='hs-comment'>-- incorrect results.  If you are worried about overflow, use</span>
<a name="line-75"></a><span class='hs-comment'>-- 'Integer' for your result type.</span>
<a name="line-76"></a><span class='hs-definition'>hexadecimal</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integral</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Reader</span> <span class='hs-varid'>a</span>
<a name="line-77"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Int #-}</span>
<a name="line-78"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Int8 #-}</span>
<a name="line-79"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Int16 #-}</span>
<a name="line-80"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Int32 #-}</span>
<a name="line-81"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Int64 #-}</span>
<a name="line-82"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Integer #-}</span>
<a name="line-83"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Word #-}</span>
<a name="line-84"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Word8 #-}</span>
<a name="line-85"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Word16 #-}</span>
<a name="line-86"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Word32 #-}</span>
<a name="line-87"></a><span class='hs-comment'>{-# SPECIALIZE hexadecimal :: Reader Word64 #-}</span>
<a name="line-88"></a><span class='hs-definition'>hexadecimal</span> <span class='hs-varid'>txt</span>
<a name="line-89"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>h</span> <span class='hs-varop'>==</span> <span class='hs-str'>"0x"</span> <span class='hs-varop'>||</span> <span class='hs-varid'>h</span> <span class='hs-varop'>==</span> <span class='hs-str'>"0X"</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hex</span> <span class='hs-varid'>t</span>
<a name="line-90"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>              <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hex</span> <span class='hs-varid'>txt</span>
<a name="line-91"></a> <span class='hs-keyword'>where</span> <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-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>splitAt</span> <span class='hs-num'>2</span> <span class='hs-varid'>txt</span>
<a name="line-92"></a>
<a name="line-93"></a><a name="hex"></a><span class='hs-definition'>hex</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integral</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Reader</span> <span class='hs-varid'>a</span>
<a name="line-94"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Int #-}</span>
<a name="line-95"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Int8 #-}</span>
<a name="line-96"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Int16 #-}</span>
<a name="line-97"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Int32 #-}</span>
<a name="line-98"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Int64 #-}</span>
<a name="line-99"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Integer #-}</span>
<a name="line-100"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Word #-}</span>
<a name="line-101"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Word8 #-}</span>
<a name="line-102"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Word16 #-}</span>
<a name="line-103"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Word32 #-}</span>
<a name="line-104"></a><span class='hs-comment'>{-# SPECIALIZE hex :: Reader Word64 #-}</span>
<a name="line-105"></a><span class='hs-definition'>hex</span> <span class='hs-varid'>txt</span>
<a name="line-106"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span> <span class='hs-varid'>h</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Left</span> <span class='hs-str'>"input does not start with a hexadecimal digit"</span>
<a name="line-107"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>foldl'</span> <span class='hs-varid'>go</span> <span class='hs-num'>0</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-108"></a>  <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-cpp'>#</span> <span class='hs-varid'>h</span><span class='hs-layout'>,</span><span class='hs-varid'>t</span> <span class='hs-cpp'>#</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>span_</span> <span class='hs-varid'>isHexDigit</span> <span class='hs-varid'>txt</span>
<a name="line-109"></a>        <span class='hs-varid'>go</span> <span class='hs-varid'>n</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span> <span class='hs-varop'>*</span> <span class='hs-num'>16</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>hexDigitToInt</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-110"></a>
<a name="line-111"></a><a name="hexDigitToInt"></a><span class='hs-definition'>hexDigitToInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-112"></a><span class='hs-definition'>hexDigitToInt</span> <span class='hs-varid'>c</span>
<a name="line-113"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;=</span> <span class='hs-chr'>'0'</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&lt;=</span> <span class='hs-chr'>'9'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>c</span> <span class='hs-comment'>-</span> <span class='hs-varid'>ord</span> <span class='hs-chr'>'0'</span>
<a name="line-114"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;=</span> <span class='hs-chr'>'a'</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&lt;=</span> <span class='hs-chr'>'f'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>c</span> <span class='hs-comment'>-</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span> <span class='hs-chr'>'a'</span> <span class='hs-comment'>-</span> <span class='hs-num'>10</span><span class='hs-layout'>)</span>
<a name="line-115"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>c</span> <span class='hs-comment'>-</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span> <span class='hs-chr'>'A'</span> <span class='hs-comment'>-</span> <span class='hs-num'>10</span><span class='hs-layout'>)</span>
<a name="line-116"></a>
<a name="line-117"></a><a name="digitToInt"></a><span class='hs-definition'>digitToInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-118"></a><span class='hs-definition'>digitToInt</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>c</span> <span class='hs-comment'>-</span> <span class='hs-varid'>ord</span> <span class='hs-chr'>'0'</span>
<a name="line-119"></a>
<a name="line-120"></a><a name="signed"></a><span class='hs-comment'>-- | Read an optional leading sign character (@\'-\'@ or @\'+\'@) and</span>
<a name="line-121"></a><span class='hs-comment'>-- apply it to the result of applying the given reader.</span>
<a name="line-122"></a><span class='hs-definition'>signed</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Reader</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Reader</span> <span class='hs-varid'>a</span>
<a name="line-123"></a><span class='hs-comment'>{-# INLINE signed #-}</span>
<a name="line-124"></a><span class='hs-definition'>signed</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runP</span> <span class='hs-layout'>(</span><span class='hs-varid'>signa</span> <span class='hs-layout'>(</span><span class='hs-conid'>P</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-125"></a>
<a name="line-126"></a><a name="rational"></a><span class='hs-comment'>-- | Read a rational number.</span>
<a name="line-127"></a><span class='hs-comment'>--</span>
<a name="line-128"></a><span class='hs-comment'>-- This function accepts an optional leading sign character, followed</span>
<a name="line-129"></a><span class='hs-comment'>-- by at least one decimal digit.  The syntax similar to that accepted</span>
<a name="line-130"></a><span class='hs-comment'>-- by the 'read' function, with the exception that a trailing @\'.\'@</span>
<a name="line-131"></a><span class='hs-comment'>-- or @\'e\'@ /not/ followed by a number is not consumed.</span>
<a name="line-132"></a><span class='hs-comment'>--</span>
<a name="line-133"></a><span class='hs-comment'>-- Examples (with behaviour identical to 'read'):</span>
<a name="line-134"></a><span class='hs-comment'>--</span>
<a name="line-135"></a><span class='hs-comment'>-- &gt;rational "3"     == Right (3.0, "")</span>
<a name="line-136"></a><span class='hs-comment'>-- &gt;rational "3.1"   == Right (3.1, "")</span>
<a name="line-137"></a><span class='hs-comment'>-- &gt;rational "3e4"   == Right (30000.0, "")</span>
<a name="line-138"></a><span class='hs-comment'>-- &gt;rational "3.1e4" == Right (31000.0, "")</span>
<a name="line-139"></a><span class='hs-comment'>-- &gt;rational ".3"    == Left "input does not start with a digit"</span>
<a name="line-140"></a><span class='hs-comment'>-- &gt;rational "e3"    == Left "input does not start with a digit"</span>
<a name="line-141"></a><span class='hs-comment'>--</span>
<a name="line-142"></a><span class='hs-comment'>-- Examples of differences from 'read':</span>
<a name="line-143"></a><span class='hs-comment'>--</span>
<a name="line-144"></a><span class='hs-comment'>-- &gt;rational "3.foo" == Right (3.0, ".foo")</span>
<a name="line-145"></a><span class='hs-comment'>-- &gt;rational "3e"    == Right (3.0, "e")</span>
<a name="line-146"></a><span class='hs-definition'>rational</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fractional</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Reader</span> <span class='hs-varid'>a</span>
<a name="line-147"></a><span class='hs-comment'>{-# SPECIALIZE rational :: Reader Double #-}</span>
<a name="line-148"></a><span class='hs-definition'>rational</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>floaty</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>real</span> <span class='hs-varid'>frac</span> <span class='hs-varid'>fracDenom</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fromRational</span> <span class='hs-varop'>$</span>
<a name="line-149"></a>                     <span class='hs-varid'>real</span> <span class='hs-varop'>%</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>frac</span> <span class='hs-varop'>%</span> <span class='hs-varid'>fracDenom</span>
<a name="line-150"></a>
<a name="line-151"></a><a name="double"></a><span class='hs-comment'>-- | Read a rational number.</span>
<a name="line-152"></a><span class='hs-comment'>--</span>
<a name="line-153"></a><span class='hs-comment'>-- The syntax accepted by this function is the same as for 'rational'.</span>
<a name="line-154"></a><span class='hs-comment'>--</span>
<a name="line-155"></a><span class='hs-comment'>-- /Note/: This function is almost ten times faster than 'rational',</span>
<a name="line-156"></a><span class='hs-comment'>-- but is slightly less accurate.</span>
<a name="line-157"></a><span class='hs-comment'>--</span>
<a name="line-158"></a><span class='hs-comment'>-- The 'Double' type supports about 16 decimal places of accuracy.</span>
<a name="line-159"></a><span class='hs-comment'>-- For 94.2% of numbers, this function and 'rational' give identical</span>
<a name="line-160"></a><span class='hs-comment'>-- results, but for the remaining 5.8%, this function loses precision</span>
<a name="line-161"></a><span class='hs-comment'>-- around the 15th decimal place.  For 0.001% of numbers, this</span>
<a name="line-162"></a><span class='hs-comment'>-- function will lose precision at the 13th or 14th decimal place.</span>
<a name="line-163"></a><span class='hs-definition'>double</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Reader</span> <span class='hs-conid'>Double</span>
<a name="line-164"></a><span class='hs-definition'>double</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>floaty</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>real</span> <span class='hs-varid'>frac</span> <span class='hs-varid'>fracDenom</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-165"></a>                   <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>real</span> <span class='hs-varop'>+</span>
<a name="line-166"></a>                   <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>frac</span> <span class='hs-varop'>/</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>fracDenom</span>
<a name="line-167"></a>
<a name="line-168"></a><a name="signa"></a><span class='hs-definition'>signa</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Num</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Parser</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Parser</span> <span class='hs-varid'>a</span>
<a name="line-169"></a><span class='hs-comment'>{-# SPECIALIZE signa :: Parser Int -&gt; Parser Int #-}</span>
<a name="line-170"></a><span class='hs-comment'>{-# SPECIALIZE signa :: Parser Int8 -&gt; Parser Int8 #-}</span>
<a name="line-171"></a><span class='hs-comment'>{-# SPECIALIZE signa :: Parser Int16 -&gt; Parser Int16 #-}</span>
<a name="line-172"></a><span class='hs-comment'>{-# SPECIALIZE signa :: Parser Int32 -&gt; Parser Int32 #-}</span>
<a name="line-173"></a><span class='hs-comment'>{-# SPECIALIZE signa :: Parser Int64 -&gt; Parser Int64 #-}</span>
<a name="line-174"></a><span class='hs-comment'>{-# SPECIALIZE signa :: Parser Integer -&gt; Parser Integer #-}</span>
<a name="line-175"></a><span class='hs-definition'>signa</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-176"></a>  <span class='hs-varid'>sign</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>perhaps</span> <span class='hs-chr'>'+'</span> <span class='hs-varop'>$</span> <span class='hs-varid'>char</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'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'-'</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'+'</span><span class='hs-layout'>)</span>
<a name="line-177"></a>  <span class='hs-keyword'>if</span> <span class='hs-varid'>sign</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'+'</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>negate</span> <span class='hs-varop'>`liftM`</span> <span class='hs-varid'>p</span>
<a name="line-178"></a>
<a name="line-179"></a><a name="Parser"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Parser</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>P</span> <span class='hs-layout'>{</span>
<a name="line-180"></a>      <span class='hs-varid'>runP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Reader</span> <span class='hs-varid'>a</span>
<a name="line-181"></a>    <span class='hs-layout'>}</span>
<a name="line-182"></a>
<a name="line-183"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-conid'>Parser</span> <span class='hs-keyword'>where</span>
<a name="line-184"></a>    <span class='hs-varid'>return</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>P</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>t</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-185"></a>    <span class='hs-comment'>{-# INLINE return #-}</span>
<a name="line-186"></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'>P</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>t</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>runP</span> <span class='hs-varid'>m</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span>
<a name="line-187"></a>                           <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span>
<a name="line-188"></a>                           <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>t'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>runP</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'>t'</span>
<a name="line-189"></a>    <span class='hs-comment'>{-# INLINE (&gt;&gt;=) #-}</span>
<a name="line-190"></a>    <span class='hs-varid'>fail</span> <span class='hs-varid'>msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>P</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-conid'>Left</span> <span class='hs-varid'>msg</span>
<a name="line-191"></a>
<a name="line-192"></a><a name="perhaps"></a><span class='hs-definition'>perhaps</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Parser</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Parser</span> <span class='hs-varid'>a</span>
<a name="line-193"></a><span class='hs-definition'>perhaps</span> <span class='hs-varid'>def</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>P</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>t</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>runP</span> <span class='hs-varid'>m</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span>
<a name="line-194"></a>                            <span class='hs-conid'>Left</span> <span class='hs-keyword'>_</span>      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>def</span><span class='hs-layout'>,</span><span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-195"></a>                            <span class='hs-varid'>r</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Right</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>r</span>
<a name="line-196"></a>
<a name="line-197"></a><a name="char"></a><span class='hs-definition'>char</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'>Parser</span> <span class='hs-conid'>Char</span>
<a name="line-198"></a><span class='hs-definition'>char</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>P</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>t</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>case</span> <span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>uncons</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span>
<a name="line-199"></a>                     <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</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'>p</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>t'</span><span class='hs-layout'>)</span>
<a name="line-200"></a>                     <span class='hs-keyword'>_</span>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Left</span> <span class='hs-str'>"character does not match"</span>
<a name="line-201"></a>
<a name="line-202"></a><a name="T"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>T</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>T</span> <span class='hs-varop'>!</span><span class='hs-conid'>Integer</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>
<a name="line-203"></a>
<a name="line-204"></a><a name="floaty"></a><span class='hs-definition'>floaty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fractional</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</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'>Reader</span> <span class='hs-varid'>a</span>
<a name="line-205"></a><span class='hs-comment'>{-# INLINE floaty #-}</span>
<a name="line-206"></a><span class='hs-definition'>floaty</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runP</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-207"></a>  <span class='hs-varid'>sign</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>perhaps</span> <span class='hs-chr'>'+'</span> <span class='hs-varop'>$</span> <span class='hs-varid'>char</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'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'-'</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'+'</span><span class='hs-layout'>)</span>
<a name="line-208"></a>  <span class='hs-varid'>real</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>P</span> <span class='hs-varid'>decimal</span>
<a name="line-209"></a>  <span class='hs-conid'>T</span> <span class='hs-varid'>fraction</span> <span class='hs-varid'>fracDigits</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>perhaps</span> <span class='hs-layout'>(</span><span class='hs-conid'>T</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-210"></a>    <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>char</span> <span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-chr'>'.'</span><span class='hs-layout'>)</span>
<a name="line-211"></a>    <span class='hs-varid'>digits</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>P</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>t</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>length</span> <span class='hs-varop'>$</span> <span class='hs-conid'>T</span><span class='hs-varop'>.</span><span class='hs-varid'>takeWhile</span> <span class='hs-varid'>isDigit</span> <span class='hs-varid'>t</span><span class='hs-layout'>,</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-212"></a>    <span class='hs-varid'>n</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>P</span> <span class='hs-varid'>decimal</span>
<a name="line-213"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>T</span> <span class='hs-varid'>n</span> <span class='hs-varid'>digits</span>
<a name="line-214"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>e</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'e'</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'E'</span>
<a name="line-215"></a>  <span class='hs-varid'>power</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>perhaps</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-varid'>char</span> <span class='hs-varid'>e</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>signa</span> <span class='hs-layout'>(</span><span class='hs-conid'>P</span> <span class='hs-varid'>decimal</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Parser</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
<a name="line-216"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>fracDigits</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>
<a name="line-217"></a>          <span class='hs-keyword'>then</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>power</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>
<a name="line-218"></a>               <span class='hs-keyword'>then</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>real</span>
<a name="line-219"></a>               <span class='hs-keyword'>else</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>real</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-num'>10</span> <span class='hs-varop'>^^</span> <span class='hs-varid'>power</span><span class='hs-layout'>)</span>
<a name="line-220"></a>          <span class='hs-keyword'>else</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>power</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>
<a name="line-221"></a>               <span class='hs-keyword'>then</span> <span class='hs-varid'>f</span> <span class='hs-varid'>real</span> <span class='hs-varid'>fraction</span> <span class='hs-layout'>(</span><span class='hs-num'>10</span> <span class='hs-varop'>^</span> <span class='hs-varid'>fracDigits</span><span class='hs-layout'>)</span>
<a name="line-222"></a>               <span class='hs-keyword'>else</span> <span class='hs-varid'>f</span> <span class='hs-varid'>real</span> <span class='hs-varid'>fraction</span> <span class='hs-layout'>(</span><span class='hs-num'>10</span> <span class='hs-varop'>^</span> <span class='hs-varid'>fracDigits</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-num'>10</span> <span class='hs-varop'>^^</span> <span class='hs-varid'>power</span><span class='hs-layout'>)</span>
<a name="line-223"></a>  <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>sign</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'+'</span>
<a name="line-224"></a>            <span class='hs-keyword'>then</span> <span class='hs-varid'>n</span>
<a name="line-225"></a>            <span class='hs-keyword'>else</span> <span class='hs-comment'>-</span><span class='hs-varid'>n</span>
</pre></body>
</html>