This file is indexed.

/usr/share/doc/libghc-quickcheck2-doc/html/src/Test-QuickCheck-All.html is in libghc-quickcheck2-doc 2.9.2-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
<?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>Test/QuickCheck/All.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE TemplateHaskell, Rank2Types, CPP #-}</span>
<a name="line-2"></a><span class='hs-cpp'>#ifndef NO_SAFE_HASKELL</span>
<a name="line-3"></a><span class='hs-comment'>{-# LANGUAGE Trustworthy #-}</span>
<a name="line-4"></a><span class='hs-cpp'>#endif</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-comment'>-- | Test all properties in the current module, using Template Haskell.</span>
<a name="line-7"></a><span class='hs-comment'>-- You need to have a @{-\# LANGUAGE TemplateHaskell \#-}@ pragma in</span>
<a name="line-8"></a><span class='hs-comment'>-- your module for any of these to work.</span>
<a name="line-9"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Test</span><span class='hs-varop'>.</span><span class='hs-conid'>QuickCheck</span><span class='hs-varop'>.</span><span class='hs-conid'>All</span><span class='hs-layout'>(</span>
<a name="line-10"></a>  <span class='hs-comment'>-- ** Testing all properties in a module</span>
<a name="line-11"></a>  <span class='hs-varid'>quickCheckAll</span><span class='hs-layout'>,</span>
<a name="line-12"></a>  <span class='hs-varid'>verboseCheckAll</span><span class='hs-layout'>,</span>
<a name="line-13"></a>  <span class='hs-varid'>forAllProperties</span><span class='hs-layout'>,</span>
<a name="line-14"></a>  <span class='hs-comment'>-- ** Testing polymorphic properties</span>
<a name="line-15"></a>  <span class='hs-varid'>polyQuickCheck</span><span class='hs-layout'>,</span>
<a name="line-16"></a>  <span class='hs-varid'>polyVerboseCheck</span><span class='hs-layout'>,</span>
<a name="line-17"></a>  <span class='hs-varid'>monomorphic</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>TH</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Test</span><span class='hs-varop'>.</span><span class='hs-conid'>QuickCheck</span><span class='hs-varop'>.</span><span class='hs-conid'>Property</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-conid'>Result</span><span class='hs-layout'>)</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Test</span><span class='hs-varop'>.</span><span class='hs-conid'>QuickCheck</span><span class='hs-varop'>.</span><span class='hs-conid'>Test</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>S</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="polyQuickCheck"></a><span class='hs-comment'>-- | Test a polymorphic property, defaulting all type variables to 'Integer'.</span>
<a name="line-29"></a><span class='hs-comment'>--</span>
<a name="line-30"></a><span class='hs-comment'>-- Invoke as @$('polyQuickCheck' 'prop)@, where @prop@ is a property.</span>
<a name="line-31"></a><span class='hs-comment'>-- Note that just evaluating @'quickCheck' prop@ in GHCi will seem to</span>
<a name="line-32"></a><span class='hs-comment'>-- work, but will silently default all type variables to @()@!</span>
<a name="line-33"></a><span class='hs-comment'>--</span>
<a name="line-34"></a><span class='hs-comment'>-- @$('polyQuickCheck' \'prop)@ means the same as</span>
<a name="line-35"></a><span class='hs-comment'>-- @'quickCheck' $('monomorphic' \'prop)@.</span>
<a name="line-36"></a><span class='hs-comment'>-- If you want to supply custom arguments to 'polyQuickCheck',</span>
<a name="line-37"></a><span class='hs-comment'>-- you will have to combine 'quickCheckWith' and 'monomorphic' yourself.</span>
<a name="line-38"></a><span class='hs-comment'>--</span>
<a name="line-39"></a><span class='hs-comment'>-- If you want to use 'polyQuickCheck' in the same file where you defined the</span>
<a name="line-40"></a><span class='hs-comment'>-- property, the same scoping problems pop up as in 'quickCheckAll':</span>
<a name="line-41"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-42"></a><span class='hs-definition'>polyQuickCheck</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExpQ</span>
<a name="line-43"></a><span class='hs-definition'>polyQuickCheck</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varid'>quickCheck</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>monomorphic</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-44"></a>
<a name="line-45"></a><a name="polyVerboseCheck"></a><span class='hs-comment'>-- | Test a polymorphic property, defaulting all type variables to 'Integer'.</span>
<a name="line-46"></a><span class='hs-comment'>-- This is just a convenience function that combines 'verboseCheck' and 'monomorphic'.</span>
<a name="line-47"></a><span class='hs-comment'>--</span>
<a name="line-48"></a><span class='hs-comment'>-- If you want to use 'polyVerboseCheck' in the same file where you defined the</span>
<a name="line-49"></a><span class='hs-comment'>-- property, the same scoping problems pop up as in 'quickCheckAll':</span>
<a name="line-50"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-51"></a><span class='hs-definition'>polyVerboseCheck</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExpQ</span>
<a name="line-52"></a><span class='hs-definition'>polyVerboseCheck</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varid'>verboseCheck</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>monomorphic</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-53"></a>
<a name="line-54"></a><a name="Error"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Error</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="monomorphic"></a><span class='hs-comment'>-- | Monomorphise an arbitrary property by defaulting all type variables to 'Integer'.</span>
<a name="line-57"></a><span class='hs-comment'>--</span>
<a name="line-58"></a><span class='hs-comment'>-- For example, if @f@ has type @'Ord' a =&gt; [a] -&gt; [a]@</span>
<a name="line-59"></a><span class='hs-comment'>-- then @$('monomorphic' 'f)@ has type @['Integer'] -&gt; ['Integer']@.</span>
<a name="line-60"></a><span class='hs-comment'>--</span>
<a name="line-61"></a><span class='hs-comment'>-- If you want to use 'monomorphic' in the same file where you defined the</span>
<a name="line-62"></a><span class='hs-comment'>-- property, the same scoping problems pop up as in 'quickCheckAll':</span>
<a name="line-63"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-64"></a><span class='hs-definition'>monomorphic</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExpQ</span>
<a name="line-65"></a><span class='hs-definition'>monomorphic</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-66"></a>  <span class='hs-varid'>ty0</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>infoType</span> <span class='hs-layout'>(</span><span class='hs-varid'>reify</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-67"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>err</span> <span class='hs-varid'>msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span> <span class='hs-varid'>msg</span> <span class='hs-varop'>++</span> <span class='hs-str'>": "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>pprint</span> <span class='hs-varid'>ty0</span>
<a name="line-68"></a>  <span class='hs-layout'>(</span><span class='hs-varid'>polys</span><span class='hs-layout'>,</span> <span class='hs-varid'>ctx</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>deconstructType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>ty0</span>
<a name="line-69"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>polys</span> <span class='hs-keyword'>of</span>
<a name="line-70"></a>    <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>expName</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-71"></a>    <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-72"></a>      <span class='hs-varid'>integer</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>t</span><span class='hs-keyglyph'>|</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-73"></a>      <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>integer</span> <span class='hs-varid'>ty</span>
<a name="line-74"></a>      <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>SigE</span> <span class='hs-layout'>(</span><span class='hs-varid'>expName</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>)</span>
<a name="line-75"></a>
<a name="line-76"></a><a name="expName"></a><span class='hs-definition'>expName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Exp</span>
<a name="line-77"></a><span class='hs-definition'>expName</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isVar</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>then</span> <span class='hs-conid'>VarE</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>ConE</span> <span class='hs-varid'>n</span>
<a name="line-78"></a>
<a name="line-79"></a><a name="isVar"></a><span class='hs-comment'>-- See section 2.4 of the Haskell 2010 Language Report, plus support for "[]"</span>
<a name="line-80"></a><span class='hs-definition'>isVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-81"></a><span class='hs-definition'>isVar</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>isVar'</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isUpper</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>`elem`</span> <span class='hs-str'>":["</span><span class='hs-layout'>)</span>
<a name="line-82"></a>            <span class='hs-varid'>isVar'</span> <span class='hs-keyword'>_</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-83"></a>        <span class='hs-keyword'>in</span> <span class='hs-varid'>isVar'</span> <span class='hs-varop'>.</span> <span class='hs-varid'>nameBase</span>
<a name="line-84"></a>
<a name="line-85"></a><a name="infoType"></a><span class='hs-definition'>infoType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Info</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span>
<a name="line-86"></a><span class='hs-cpp'>#if MIN_VERSION_template_haskell(2,11,0)</span>
<a name="line-87"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassOpI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-88"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>DataConI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-89"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>VarI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
<a name="line-90"></a><span class='hs-cpp'>#else</span>
<a name="line-91"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassOpI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</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'>ty</span>
<a name="line-92"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>DataConI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</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'>ty</span>
<a name="line-93"></a><span class='hs-definition'>infoType</span> <span class='hs-layout'>(</span><span class='hs-conid'>VarI</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</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'>ty</span>
<a name="line-94"></a><span class='hs-cpp'>#endif</span>
<a name="line-95"></a>
<a name="line-96"></a><a name="deconstructType"></a><span class='hs-definition'>deconstructType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Error</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Q</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>Cxt</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-97"></a><span class='hs-definition'>deconstructType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>ty0</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ForallT</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ctx</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-98"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>PlainTV</span>  <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-99"></a><span class='hs-cpp'>#if MIN_VERSION_template_haskell(2,8,0)</span>
<a name="line-100"></a>      <span class='hs-varid'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>KindedTV</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>StarT</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-101"></a><span class='hs-cpp'>#else</span>
<a name="line-102"></a>      <span class='hs-varid'>plain</span> <span class='hs-layout'>(</span><span class='hs-conid'>KindedTV</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>StarK</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-103"></a><span class='hs-cpp'>#endif</span>
<a name="line-104"></a>      <span class='hs-varid'>plain</span> <span class='hs-keyword'>_</span>                  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-105"></a>  <span class='hs-varid'>unless</span> <span class='hs-layout'>(</span><span class='hs-varid'>all</span> <span class='hs-varid'>plain</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>err</span> <span class='hs-str'>"Higher-kinded type variables in type"</span>
<a name="line-106"></a>  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>PlainTV</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ctx</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-107"></a><span class='hs-definition'>deconstructType</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-108"></a>
<a name="line-109"></a><a name="monomorphiseType"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Error</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TypeQ</span>
<a name="line-110"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>VarT</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>mono</span>
<a name="line-111"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-layout'>(</span><span class='hs-conid'>AppT</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM2</span> <span class='hs-conid'>AppT</span> <span class='hs-layout'>(</span><span class='hs-varid'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>t1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span>
<a name="line-112"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ForallT</span> <span class='hs-keyword'>_</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'>err</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Higher-ranked type"</span>
<a name="line-113"></a><span class='hs-definition'>monomorphiseType</span> <span class='hs-varid'>err</span> <span class='hs-varid'>mono</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>ty</span>
<a name="line-114"></a>
<a name="line-115"></a><a name="forAllProperties"></a><span class='hs-comment'>-- | Test all properties in the current module, using a custom</span>
<a name="line-116"></a><span class='hs-comment'>-- 'quickCheck' function. The same caveats as with 'quickCheckAll'</span>
<a name="line-117"></a><span class='hs-comment'>-- apply.</span>
<a name="line-118"></a><span class='hs-comment'>--</span>
<a name="line-119"></a><span class='hs-comment'>-- @$'forAllProperties'@ has type @('Property' -&gt; 'IO' 'Result') -&gt; 'IO' 'Bool'@.</span>
<a name="line-120"></a><span class='hs-comment'>-- An example invocation is @$'forAllProperties' 'quickCheckResult'@,</span>
<a name="line-121"></a><span class='hs-comment'>-- which does the same thing as @$'quickCheckAll'@.</span>
<a name="line-122"></a><span class='hs-comment'>--</span>
<a name="line-123"></a><span class='hs-comment'>-- 'forAllProperties' has the same issue with scoping as 'quickCheckAll':</span>
<a name="line-124"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-125"></a><span class='hs-definition'>forAllProperties</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Q</span> <span class='hs-conid'>Exp</span> <span class='hs-comment'>-- :: (Property -&gt; IO Result) -&gt; IO Bool</span>
<a name="line-126"></a><span class='hs-definition'>forAllProperties</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-127"></a>  <span class='hs-conid'>Loc</span> <span class='hs-layout'>{</span> <span class='hs-varid'>loc_filename</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filename</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>location</span>
<a name="line-128"></a>  <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>filename</span> <span class='hs-varop'>==</span> <span class='hs-str'>"&lt;interactive&gt;"</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>error</span> <span class='hs-str'>"don't run this interactively"</span>
<a name="line-129"></a>  <span class='hs-varid'>ls</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>lines</span> <span class='hs-layout'>(</span><span class='hs-varid'>readUTF8File</span> <span class='hs-varid'>filename</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-130"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>prefixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>takeWhile</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'>isAlphaNum</span> <span class='hs-varid'>c</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-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'\''</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>dropWhile</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'>isSpace</span> <span class='hs-varid'>c</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-chr'>'&gt;'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>ls</span>
<a name="line-131"></a>      <span class='hs-varid'>idents</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nubBy</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-varid'>snd</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-str'>"prop_"</span> <span class='hs-varop'>`isPrefixOf`</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>zip</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>1</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>prefixes</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-132"></a><span class='hs-cpp'>#if MIN_VERSION_template_haskell(2,8,0)</span>
<a name="line-133"></a>      <span class='hs-varid'>warning</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reportWarning</span> <span class='hs-layout'>(</span><span class='hs-str'>"Name "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>x</span> <span class='hs-varop'>++</span> <span class='hs-str'>" found in source file but was not in scope"</span><span class='hs-layout'>)</span>
<a name="line-134"></a><span class='hs-cpp'>#else</span>
<a name="line-135"></a>      <span class='hs-varid'>warning</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>report</span> <span class='hs-conid'>False</span> <span class='hs-layout'>(</span><span class='hs-str'>"Name "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>x</span> <span class='hs-varop'>++</span> <span class='hs-str'>" found in source file but was not in scope"</span><span class='hs-layout'>)</span>
<a name="line-136"></a><span class='hs-cpp'>#endif</span>
<a name="line-137"></a>      <span class='hs-varid'>quickCheckOne</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Q</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Exp</span><span class='hs-keyglyph'>]</span>
<a name="line-138"></a>      <span class='hs-varid'>quickCheckOne</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-139"></a>        <span class='hs-varid'>exists</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-layout'>(</span><span class='hs-varid'>warning</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span> <span class='hs-varop'>`recover`</span> <span class='hs-layout'>(</span><span class='hs-varid'>reify</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkName</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span>
<a name="line-140"></a>        <span class='hs-keyword'>if</span> <span class='hs-varid'>exists</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>sequence</span> <span class='hs-keyglyph'>[</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>stringE</span> <span class='hs-varop'>$</span> <span class='hs-varid'>x</span> <span class='hs-varop'>++</span> <span class='hs-str'>" from "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>filename</span> <span class='hs-varop'>++</span> <span class='hs-str'>":"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-141"></a>                                     <span class='hs-varid'>property</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>monomorphic</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkName</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>]</span>
<a name="line-142"></a>         <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-143"></a>  <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varid'>runQuickCheckAll</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-conid'>ListE</span> <span class='hs-varop'>.</span> <span class='hs-varid'>concat</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapM</span> <span class='hs-varid'>quickCheckOne</span> <span class='hs-varid'>idents</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-144"></a>
<a name="line-145"></a><a name="readUTF8File"></a><span class='hs-definition'>readUTF8File</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>openFile</span> <span class='hs-varid'>name</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>ReadMode</span> <span class='hs-varop'>&gt;&gt;=</span>
<a name="line-146"></a>                    <span class='hs-varid'>set_utf8_io_enc</span> <span class='hs-varop'>&gt;&gt;=</span>
<a name="line-147"></a>                    <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>hGetContents</span>
<a name="line-148"></a>
<a name="line-149"></a><a name="set_utf8_io_enc"></a><span class='hs-comment'>-- Deal with UTF-8 input and output.</span>
<a name="line-150"></a><span class='hs-definition'>set_utf8_io_enc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span>
<a name="line-151"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ &gt; 611</span>
<a name="line-152"></a><span class='hs-comment'>-- possibly if MIN_VERSION_base(4,2,0)</span>
<a name="line-153"></a><span class='hs-definition'>set_utf8_io_enc</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>hSetEncoding</span> <span class='hs-varid'>h</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>utf8</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>h</span>
<a name="line-154"></a><span class='hs-cpp'>#else</span>
<a name="line-155"></a><span class='hs-definition'>set_utf8_io_enc</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varid'>h</span>
<a name="line-156"></a><span class='hs-cpp'>#endif</span>
<a name="line-157"></a>
<a name="line-158"></a><a name="quickCheckAll"></a><span class='hs-comment'>-- | Test all properties in the current module.</span>
<a name="line-159"></a><span class='hs-comment'>-- The name of the property must begin with @prop_@.</span>
<a name="line-160"></a><span class='hs-comment'>-- Polymorphic properties will be defaulted to 'Integer'.</span>
<a name="line-161"></a><span class='hs-comment'>-- Returns 'True' if all tests succeeded, 'False' otherwise.</span>
<a name="line-162"></a><span class='hs-comment'>--</span>
<a name="line-163"></a><span class='hs-comment'>-- To use 'quickCheckAll', add a definition to your module along</span>
<a name="line-164"></a><span class='hs-comment'>-- the lines of</span>
<a name="line-165"></a><span class='hs-comment'>--</span>
<a name="line-166"></a><span class='hs-comment'>-- &gt; return []</span>
<a name="line-167"></a><span class='hs-comment'>-- &gt; runTests = $quickCheckAll</span>
<a name="line-168"></a><span class='hs-comment'>--</span>
<a name="line-169"></a><span class='hs-comment'>-- and then execute @runTests@.</span>
<a name="line-170"></a><span class='hs-comment'>--</span>
<a name="line-171"></a><span class='hs-comment'>-- Note: the bizarre @return []@ in the example above is needed on</span>
<a name="line-172"></a><span class='hs-comment'>-- GHC 7.8; without it, 'quickCheckAll' will not be able to find</span>
<a name="line-173"></a><span class='hs-comment'>-- any of the properties. For the curious, the @return []@ is a</span>
<a name="line-174"></a><span class='hs-comment'>-- Template Haskell splice that makes GHC insert the empty list</span>
<a name="line-175"></a><span class='hs-comment'>-- of declarations at that point in the program; GHC typechecks</span>
<a name="line-176"></a><span class='hs-comment'>-- everything before the @return []@ before it starts on the rest</span>
<a name="line-177"></a><span class='hs-comment'>-- of the module, which means that the later call to 'quickCheckAll'</span>
<a name="line-178"></a><span class='hs-comment'>-- can see everything that was defined before the @return []@. Yikes!</span>
<a name="line-179"></a><span class='hs-definition'>quickCheckAll</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Q</span> <span class='hs-conid'>Exp</span>
<a name="line-180"></a><span class='hs-definition'>quickCheckAll</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>forAllProperties</span><span class='hs-layout'>)</span> <span class='hs-varid'>quickCheckResult</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-181"></a>
<a name="line-182"></a><a name="verboseCheckAll"></a><span class='hs-comment'>-- | Test all properties in the current module.</span>
<a name="line-183"></a><span class='hs-comment'>-- This is just a convenience function that combines 'quickCheckAll' and 'verbose'.</span>
<a name="line-184"></a><span class='hs-comment'>--</span>
<a name="line-185"></a><span class='hs-comment'>-- 'verboseCheckAll' has the same issue with scoping as 'quickCheckAll':</span>
<a name="line-186"></a><span class='hs-comment'>-- see the note there about @return []@.</span>
<a name="line-187"></a><span class='hs-definition'>verboseCheckAll</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Q</span> <span class='hs-conid'>Exp</span>
<a name="line-188"></a><span class='hs-definition'>verboseCheckAll</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>|</span> <span class='hs-varop'>$</span><span class='hs-layout'>(</span><span class='hs-varid'>forAllProperties</span><span class='hs-layout'>)</span> <span class='hs-varid'>verboseCheckResult</span> <span class='hs-keyglyph'>|</span><span class='hs-keyglyph'>]</span>
<a name="line-189"></a>
<a name="line-190"></a><a name="runQuickCheckAll"></a><span class='hs-definition'>runQuickCheckAll</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>Property</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Property</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Result</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-191"></a><span class='hs-definition'>runQuickCheckAll</span> <span class='hs-varid'>ps</span> <span class='hs-varid'>qc</span> <span class='hs-keyglyph'>=</span>
<a name="line-192"></a>  <span class='hs-varid'>fmap</span> <span class='hs-varid'>and</span> <span class='hs-varop'>.</span> <span class='hs-varid'>forM</span> <span class='hs-varid'>ps</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-193"></a>    <span class='hs-varid'>putStrLn</span> <span class='hs-varop'>$</span> <span class='hs-str'>"=== "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>xs</span> <span class='hs-varop'>++</span> <span class='hs-str'>" ==="</span>
<a name="line-194"></a>    <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>qc</span> <span class='hs-varid'>p</span>
<a name="line-195"></a>    <span class='hs-varid'>putStrLn</span> <span class='hs-str'>""</span>
<a name="line-196"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-197"></a>      <span class='hs-conid'>Success</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-198"></a>      <span class='hs-conid'>Failure</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-199"></a>      <span class='hs-conid'>NoExpectedFailure</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-200"></a>      <span class='hs-conid'>GaveUp</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-201"></a>      <span class='hs-conid'>InsufficientCoverage</span> <span class='hs-layout'>{</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
</pre></body>
</html>