/usr/share/doc/libghc-ranged-sets-doc/html/src/Data-Ranged-Ranges.html is in libghc-ranged-sets-doc 0.3.0-5build2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 | <?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/Ranged/Ranges.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-2"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><span class='hs-comment'>-- Module : Data.Ranged.Ranges</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright : (c) Paul Johnson 2006</span>
<a name="line-5"></a><span class='hs-comment'>-- License : BSD-style</span>
<a name="line-6"></a><span class='hs-comment'>-- Maintainer : paul@cogito.org.uk</span>
<a name="line-7"></a><span class='hs-comment'>-- Stability : experimental</span>
<a name="line-8"></a><span class='hs-comment'>-- Portability : portable</span>
<a name="line-9"></a><span class='hs-comment'>--</span>
<a name="line-10"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-comment'>-- | A range has an upper and lower boundary.</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'>Ranged</span><span class='hs-varop'>.</span><span class='hs-conid'>Ranges</span> <span class='hs-layout'>(</span>
<a name="line-14"></a> <span class='hs-comment'>-- ** Construction</span>
<a name="line-15"></a> <span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-16"></a> <span class='hs-varid'>emptyRange</span><span class='hs-layout'>,</span>
<a name="line-17"></a> <span class='hs-varid'>fullRange</span><span class='hs-layout'>,</span>
<a name="line-18"></a> <span class='hs-comment'>-- ** Predicates</span>
<a name="line-19"></a> <span class='hs-varid'>rangeIsEmpty</span><span class='hs-layout'>,</span>
<a name="line-20"></a> <span class='hs-varid'>rangeIsFull</span><span class='hs-layout'>,</span>
<a name="line-21"></a> <span class='hs-varid'>rangeOverlap</span><span class='hs-layout'>,</span>
<a name="line-22"></a> <span class='hs-varid'>rangeEncloses</span><span class='hs-layout'>,</span>
<a name="line-23"></a> <span class='hs-varid'>rangeSingletonValue</span><span class='hs-layout'>,</span>
<a name="line-24"></a> <span class='hs-comment'>-- ** Membership</span>
<a name="line-25"></a> <span class='hs-varid'>rangeHas</span><span class='hs-layout'>,</span>
<a name="line-26"></a> <span class='hs-varid'>rangeListHas</span><span class='hs-layout'>,</span>
<a name="line-27"></a> <span class='hs-comment'>-- ** Set Operations</span>
<a name="line-28"></a> <span class='hs-varid'>singletonRange</span><span class='hs-layout'>,</span>
<a name="line-29"></a> <span class='hs-varid'>rangeIntersection</span><span class='hs-layout'>,</span>
<a name="line-30"></a> <span class='hs-varid'>rangeUnion</span><span class='hs-layout'>,</span>
<a name="line-31"></a> <span class='hs-varid'>rangeDifference</span><span class='hs-layout'>,</span>
<a name="line-32"></a> <span class='hs-comment'>-- ** QuickCheck properties</span>
<a name="line-33"></a> <span class='hs-varid'>prop_unionRange</span><span class='hs-layout'>,</span>
<a name="line-34"></a> <span class='hs-varid'>prop_unionRangeLength</span><span class='hs-layout'>,</span>
<a name="line-35"></a> <span class='hs-varid'>prop_intersectionRange</span><span class='hs-layout'>,</span>
<a name="line-36"></a> <span class='hs-varid'>prop_differenceRange</span><span class='hs-layout'>,</span>
<a name="line-37"></a> <span class='hs-varid'>prop_intersectionOverlap</span><span class='hs-layout'>,</span>
<a name="line-38"></a> <span class='hs-varid'>prop_enclosureUnion</span><span class='hs-layout'>,</span>
<a name="line-39"></a> <span class='hs-varid'>prop_singletonRangeHas</span><span class='hs-layout'>,</span>
<a name="line-40"></a> <span class='hs-varid'>prop_singletonRangeHasOnly</span><span class='hs-layout'>,</span>
<a name="line-41"></a> <span class='hs-varid'>prop_singletonRangeConverse</span><span class='hs-layout'>,</span>
<a name="line-42"></a> <span class='hs-varid'>prop_emptyNonSingleton</span><span class='hs-layout'>,</span>
<a name="line-43"></a> <span class='hs-varid'>prop_fullNonSingleton</span><span class='hs-layout'>,</span>
<a name="line-44"></a> <span class='hs-varid'>prop_nonSingleton</span><span class='hs-layout'>,</span>
<a name="line-45"></a> <span class='hs-varid'>prop_intSingleton</span>
<a name="line-46"></a><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-47"></a>
<a name="line-48"></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-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Ranged</span><span class='hs-varop'>.</span><span class='hs-conid'>Boundaries</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Test</span><span class='hs-varop'>.</span><span class='hs-conid'>QuickCheck</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="Range"></a><span class='hs-comment'>-- | A Range has upper and lower boundaries.</span>
<a name="line-54"></a><a name="Range"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Range</span> <span class='hs-layout'>{</span><span class='hs-varid'>rangeLower</span><span class='hs-layout'>,</span> <span class='hs-varid'>rangeUpper</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Boundary</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="instance%20Eq%20(Range%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-57"></a> <span class='hs-varid'>r1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r1</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span>
<a name="line-58"></a> <span class='hs-layout'>(</span><span class='hs-varid'>rangeLower</span> <span class='hs-varid'>r1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>rangeLower</span> <span class='hs-varid'>r2</span> <span class='hs-varop'>&&</span>
<a name="line-59"></a> <span class='hs-varid'>rangeUpper</span> <span class='hs-varid'>r1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>rangeUpper</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span>
<a name="line-60"></a>
<a name="line-61"></a>
<a name="line-62"></a><a name="instance%20Ord%20(Range%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Ord</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-63"></a> <span class='hs-varid'>compare</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span>
<a name="line-64"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EQ</span>
<a name="line-65"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r1</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LT</span>
<a name="line-66"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GT</span>
<a name="line-67"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-varid'>rangeLower</span> <span class='hs-varid'>r1</span><span class='hs-layout'>,</span> <span class='hs-varid'>rangeUpper</span> <span class='hs-varid'>r1</span><span class='hs-layout'>)</span>
<a name="line-68"></a> <span class='hs-layout'>(</span><span class='hs-varid'>rangeLower</span> <span class='hs-varid'>r2</span><span class='hs-layout'>,</span> <span class='hs-varid'>rangeUpper</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span>
<a name="line-69"></a>
<a name="line-70"></a><a name="instance%20Show%20(Range%20a)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Show</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-71"></a> <span class='hs-varid'>show</span> <span class='hs-varid'>r</span>
<a name="line-72"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"Empty"</span>
<a name="line-73"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>rangeIsFull</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"All x"</span>
<a name="line-74"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span>
<a name="line-75"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>rangeSingletonValue</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-76"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-str'>"x == "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>v</span>
<a name="line-77"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>lowerBound</span> <span class='hs-varop'>++</span> <span class='hs-str'>"x"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>upperBound</span>
<a name="line-78"></a> <span class='hs-keyword'>where</span>
<a name="line-79"></a> <span class='hs-varid'>lowerBound</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>rangeLower</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-80"></a> <span class='hs-conid'>BoundaryBelowAll</span> <span class='hs-keyglyph'>-></span> <span class='hs-str'>""</span>
<a name="line-81"></a> <span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>show</span> <span class='hs-varid'>v</span> <span class='hs-varop'>++</span> <span class='hs-str'>" <= "</span>
<a name="line-82"></a> <span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>show</span> <span class='hs-varid'>v</span> <span class='hs-varop'>++</span> <span class='hs-str'>" < "</span>
<a name="line-83"></a> <span class='hs-conid'>BoundaryAboveAll</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>error</span> <span class='hs-str'>"show Range: lower bound is BoundaryAboveAll"</span>
<a name="line-84"></a> <span class='hs-varid'>upperBound</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>rangeUpper</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-85"></a> <span class='hs-conid'>BoundaryBelowAll</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>error</span> <span class='hs-str'>"show Range: upper bound is BoundaryBelowAll"</span>
<a name="line-86"></a> <span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-str'>" < "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>v</span>
<a name="line-87"></a> <span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-str'>" <= "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>v</span>
<a name="line-88"></a> <span class='hs-conid'>BoundaryAboveAll</span> <span class='hs-keyglyph'>-></span> <span class='hs-str'>""</span>
<a name="line-89"></a>
<a name="line-90"></a>
<a name="line-91"></a><a name="rangeHas"></a><span class='hs-comment'>-- | True if the value is within the range.</span>
<a name="line-92"></a><span class='hs-definition'>rangeHas</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-93"></a>
<a name="line-94"></a><span class='hs-definition'>rangeHas</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>b1</span> <span class='hs-varid'>b2</span><span class='hs-layout'>)</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span>
<a name="line-95"></a> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-varop'>/>/</span> <span class='hs-varid'>b1</span><span class='hs-layout'>)</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-varop'>/>/</span> <span class='hs-varid'>b2</span><span class='hs-layout'>)</span>
<a name="line-96"></a>
<a name="line-97"></a>
<a name="line-98"></a><a name="rangeListHas"></a><span class='hs-comment'>-- | True if the value is within one of the ranges.</span>
<a name="line-99"></a><span class='hs-definition'>rangeListHas</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span>
<a name="line-100"></a> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Range</span> <span class='hs-varid'>v</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-101"></a><span class='hs-definition'>rangeListHas</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>or</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>rangeHas</span> <span class='hs-varid'>r</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-varid'>ls</span>
<a name="line-102"></a>
<a name="line-103"></a>
<a name="line-104"></a><a name="emptyRange"></a><span class='hs-comment'>-- | The empty range</span>
<a name="line-105"></a><span class='hs-definition'>emptyRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span>
<a name="line-106"></a><span class='hs-definition'>emptyRange</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>BoundaryAboveAll</span> <span class='hs-conid'>BoundaryBelowAll</span>
<a name="line-107"></a>
<a name="line-108"></a>
<a name="line-109"></a><a name="fullRange"></a><span class='hs-comment'>-- | The full range. All values are within it.</span>
<a name="line-110"></a><span class='hs-definition'>fullRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span>
<a name="line-111"></a><span class='hs-definition'>fullRange</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>BoundaryBelowAll</span> <span class='hs-conid'>BoundaryAboveAll</span>
<a name="line-112"></a>
<a name="line-113"></a>
<a name="line-114"></a><a name="singletonRange"></a><span class='hs-comment'>-- | A range containing a single value</span>
<a name="line-115"></a><span class='hs-definition'>singletonRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span>
<a name="line-116"></a><span class='hs-definition'>singletonRange</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-117"></a>
<a name="line-118"></a>
<a name="line-119"></a><a name="rangeSingletonValue"></a><span class='hs-comment'>-- | If the range is a singleton, returns @Just@ the value. Otherwise returns</span>
<a name="line-120"></a><span class='hs-comment'>-- @Nothing@.</span>
<a name="line-121"></a><span class='hs-comment'>--</span>
<a name="line-122"></a><span class='hs-comment'>-- Known bug: This always returns @Nothing@ for ranges including</span>
<a name="line-123"></a><span class='hs-comment'>-- @BoundaryBelowAll@ or @BoundaryAboveAll@. For bounded types this can be</span>
<a name="line-124"></a><span class='hs-comment'>-- incorrect. For instance, the following range only contains one value:</span>
<a name="line-125"></a><span class='hs-comment'>--</span>
<a name="line-126"></a><span class='hs-comment'>-- > Range (BoundaryBelow maxBound) BoundaryAboveAll</span>
<a name="line-127"></a><span class='hs-definition'>rangeSingletonValue</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>v</span>
<a name="line-128"></a><span class='hs-definition'>rangeSingletonValue</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>v1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-129"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>adjacent</span> <span class='hs-varid'>v1</span> <span class='hs-varid'>v2</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>v1</span>
<a name="line-130"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-131"></a><span class='hs-definition'>rangeSingletonValue</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>v1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-132"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>v2</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>v1</span>
<a name="line-133"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-134"></a><span class='hs-definition'>rangeSingletonValue</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>v1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-135"></a> <span class='hs-keyword'>do</span>
<a name="line-136"></a> <span class='hs-varid'>v2'</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>adjacentBelow</span> <span class='hs-varid'>v2</span>
<a name="line-137"></a> <span class='hs-varid'>v2''</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>adjacentBelow</span> <span class='hs-varid'>v2'</span>
<a name="line-138"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>v1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>v2''</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>v2'</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>Nothing</span>
<a name="line-139"></a><span class='hs-definition'>rangeSingletonValue</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>v1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-140"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>adjacent</span> <span class='hs-varid'>v1</span> <span class='hs-varid'>v2</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>v2</span>
<a name="line-141"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-142"></a><span class='hs-definition'>rangeSingletonValue</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-143"></a>
<a name="line-144"></a><a name="rangeIsEmpty"></a><span class='hs-comment'>-- | A range is empty unless its upper boundary is greater than its lower</span>
<a name="line-145"></a><span class='hs-comment'>-- boundary.</span>
<a name="line-146"></a><span class='hs-definition'>rangeIsEmpty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-147"></a><span class='hs-definition'>rangeIsEmpty</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower</span> <span class='hs-varid'>upper</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>upper</span> <span class='hs-varop'><=</span> <span class='hs-varid'>lower</span>
<a name="line-148"></a>
<a name="line-149"></a>
<a name="line-150"></a><a name="rangeIsFull"></a><span class='hs-comment'>-- | A range is full if it contains every possible value.</span>
<a name="line-151"></a><span class='hs-definition'>rangeIsFull</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-152"></a><span class='hs-definition'>rangeIsFull</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>==</span> <span class='hs-varid'>fullRange</span><span class='hs-layout'>)</span>
<a name="line-153"></a>
<a name="line-154"></a><a name="rangeOverlap"></a><span class='hs-comment'>-- | Two ranges overlap if their intersection is non-empty.</span>
<a name="line-155"></a><span class='hs-definition'>rangeOverlap</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-156"></a><span class='hs-definition'>rangeOverlap</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span>
<a name="line-157"></a> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r1</span><span class='hs-layout'>)</span>
<a name="line-158"></a> <span class='hs-varop'>&&</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span>
<a name="line-159"></a> <span class='hs-varop'>&&</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>rangeUpper</span> <span class='hs-varid'>r1</span> <span class='hs-varop'><=</span> <span class='hs-varid'>rangeLower</span> <span class='hs-varid'>r2</span> <span class='hs-varop'>||</span> <span class='hs-varid'>rangeUpper</span> <span class='hs-varid'>r2</span> <span class='hs-varop'><=</span> <span class='hs-varid'>rangeLower</span> <span class='hs-varid'>r1</span><span class='hs-layout'>)</span>
<a name="line-160"></a>
<a name="line-161"></a>
<a name="line-162"></a><a name="rangeEncloses"></a><span class='hs-comment'>-- | The first range encloses the second if every value in the second range is</span>
<a name="line-163"></a><span class='hs-comment'>-- also within the first range. If the second range is empty then this is</span>
<a name="line-164"></a><span class='hs-comment'>-- always true.</span>
<a name="line-165"></a><span class='hs-definition'>rangeEncloses</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-166"></a><span class='hs-definition'>rangeEncloses</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span>
<a name="line-167"></a> <span class='hs-layout'>(</span><span class='hs-varid'>rangeLower</span> <span class='hs-varid'>r1</span> <span class='hs-varop'><=</span> <span class='hs-varid'>rangeLower</span> <span class='hs-varid'>r2</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>rangeUpper</span> <span class='hs-varid'>r2</span> <span class='hs-varop'><=</span> <span class='hs-varid'>rangeUpper</span> <span class='hs-varid'>r1</span><span class='hs-layout'>)</span>
<a name="line-168"></a> <span class='hs-varop'>||</span> <span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r2</span>
<a name="line-169"></a>
<a name="line-170"></a>
<a name="line-171"></a><a name="rangeIntersection"></a><span class='hs-comment'>-- | Intersection of two ranges, if any.</span>
<a name="line-172"></a><span class='hs-definition'>rangeIntersection</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span>
<a name="line-173"></a><span class='hs-definition'>rangeIntersection</span> <span class='hs-varid'>r1</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower1</span> <span class='hs-varid'>upper1</span><span class='hs-layout'>)</span> <span class='hs-varid'>r2</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower2</span> <span class='hs-varid'>upper2</span><span class='hs-layout'>)</span>
<a name="line-174"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r1</span> <span class='hs-varop'>||</span> <span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyRange</span>
<a name="line-175"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-varid'>lower1</span> <span class='hs-varid'>lower2</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>min</span> <span class='hs-varid'>upper1</span> <span class='hs-varid'>upper2</span><span class='hs-layout'>)</span>
<a name="line-176"></a>
<a name="line-177"></a>
<a name="line-178"></a><a name="rangeUnion"></a><span class='hs-comment'>-- | Union of two ranges. Returns one or two results.</span>
<a name="line-179"></a><span class='hs-comment'>--</span>
<a name="line-180"></a><span class='hs-comment'>-- If there are two results then they are guaranteed to have a non-empty</span>
<a name="line-181"></a><span class='hs-comment'>-- gap in between, but may not be in ascending order.</span>
<a name="line-182"></a><span class='hs-definition'>rangeUnion</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Range</span> <span class='hs-varid'>v</span><span class='hs-keyglyph'>]</span>
<a name="line-183"></a><span class='hs-definition'>rangeUnion</span> <span class='hs-varid'>r1</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower1</span> <span class='hs-varid'>upper1</span><span class='hs-layout'>)</span> <span class='hs-varid'>r2</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower2</span> <span class='hs-varid'>upper2</span><span class='hs-layout'>)</span>
<a name="line-184"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r1</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r2</span><span class='hs-keyglyph'>]</span>
<a name="line-185"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r1</span><span class='hs-keyglyph'>]</span>
<a name="line-186"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span>
<a name="line-187"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>touching</span> <span class='hs-keyword'>then</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower</span> <span class='hs-varid'>upper</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>else</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r1</span><span class='hs-layout'>,</span> <span class='hs-varid'>r2</span><span class='hs-keyglyph'>]</span>
<a name="line-188"></a> <span class='hs-keyword'>where</span>
<a name="line-189"></a> <span class='hs-varid'>touching</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-varid'>lower1</span> <span class='hs-varid'>lower2</span><span class='hs-layout'>)</span> <span class='hs-varop'><=</span> <span class='hs-layout'>(</span><span class='hs-varid'>min</span> <span class='hs-varid'>upper1</span> <span class='hs-varid'>upper2</span><span class='hs-layout'>)</span>
<a name="line-190"></a> <span class='hs-varid'>lower</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>min</span> <span class='hs-varid'>lower1</span> <span class='hs-varid'>lower2</span>
<a name="line-191"></a> <span class='hs-varid'>upper</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>max</span> <span class='hs-varid'>upper1</span> <span class='hs-varid'>upper2</span>
<a name="line-192"></a>
<a name="line-193"></a>
<a name="line-194"></a><a name="rangeDifference"></a><span class='hs-comment'>-- | @range1@ minus @range2@. Returns zero, one or two results. Multiple</span>
<a name="line-195"></a><span class='hs-comment'>-- results are guaranteed to have non-empty gaps in between, but may not be in</span>
<a name="line-196"></a><span class='hs-comment'>-- ascending order.</span>
<a name="line-197"></a><span class='hs-definition'>rangeDifference</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Range</span> <span class='hs-varid'>v</span><span class='hs-keyglyph'>]</span>
<a name="line-198"></a>
<a name="line-199"></a><span class='hs-definition'>rangeDifference</span> <span class='hs-varid'>r1</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower1</span> <span class='hs-varid'>upper1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower2</span> <span class='hs-varid'>upper2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-200"></a> <span class='hs-comment'>-- There are six possibilities</span>
<a name="line-201"></a> <span class='hs-comment'>-- 1: r2 completely less than r1</span>
<a name="line-202"></a> <span class='hs-comment'>-- 2: r2 overlaps bottom of r1</span>
<a name="line-203"></a> <span class='hs-comment'>-- 3: r2 encloses r1</span>
<a name="line-204"></a> <span class='hs-comment'>-- 4: r1 encloses r2</span>
<a name="line-205"></a> <span class='hs-comment'>-- 5: r2 overlaps top of r1</span>
<a name="line-206"></a> <span class='hs-comment'>-- 6: r2 completely greater than r1</span>
<a name="line-207"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>intersects</span>
<a name="line-208"></a> <span class='hs-keyword'>then</span> <span class='hs-comment'>-- Cases 2,3,4,5</span>
<a name="line-209"></a> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varop'>.</span> <span class='hs-varid'>rangeIsEmpty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower1</span> <span class='hs-varid'>lower2</span><span class='hs-layout'>,</span> <span class='hs-conid'>Range</span> <span class='hs-varid'>upper2</span> <span class='hs-varid'>upper1</span><span class='hs-keyglyph'>]</span>
<a name="line-210"></a> <span class='hs-keyword'>else</span> <span class='hs-comment'>-- Cases 1, 6</span>
<a name="line-211"></a> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r1</span><span class='hs-keyglyph'>]</span>
<a name="line-212"></a> <span class='hs-keyword'>where</span>
<a name="line-213"></a> <span class='hs-varid'>intersects</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-varid'>lower1</span> <span class='hs-varid'>lower2</span><span class='hs-layout'>)</span> <span class='hs-varop'><</span> <span class='hs-layout'>(</span><span class='hs-varid'>min</span> <span class='hs-varid'>upper1</span> <span class='hs-varid'>upper2</span><span class='hs-layout'>)</span>
<a name="line-214"></a>
<a name="line-215"></a>
<a name="line-216"></a><span class='hs-comment'>-- QuickCheck generators</span>
<a name="line-217"></a>
<a name="line-218"></a><a name="instance%20Arbitrary%20(Range%20v)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Arbitrary</span> <span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span>
<a name="line-219"></a> <span class='hs-conid'>Arbitrary</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-220"></a>
<a name="line-221"></a> <span class='hs-varid'>arbitrary</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>frequency</span> <span class='hs-keyglyph'>[</span>
<a name="line-222"></a> <span class='hs-layout'>(</span><span class='hs-num'>17</span><span class='hs-layout'>,</span> <span class='hs-keyword'>do</span> <span class='hs-comment'>-- Ordinary range</span>
<a name="line-223"></a> <span class='hs-varid'>b1</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>arbitrary</span>
<a name="line-224"></a> <span class='hs-varid'>b2</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>arbitrary</span>
<a name="line-225"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>b1</span> <span class='hs-varop'><</span> <span class='hs-varid'>b2</span>
<a name="line-226"></a> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Range</span> <span class='hs-varid'>b1</span> <span class='hs-varid'>b2</span>
<a name="line-227"></a> <span class='hs-keyword'>else</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Range</span> <span class='hs-varid'>b2</span> <span class='hs-varid'>b1</span>
<a name="line-228"></a> <span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-229"></a> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-keyword'>do</span> <span class='hs-comment'>-- Singleton range</span>
<a name="line-230"></a> <span class='hs-varid'>v</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>arbitrary</span>
<a name="line-231"></a> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>singletonRange</span> <span class='hs-varid'>v</span>
<a name="line-232"></a> <span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-233"></a> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>return</span> <span class='hs-varid'>emptyRange</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-234"></a> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-varid'>return</span> <span class='hs-varid'>fullRange</span><span class='hs-layout'>)</span>
<a name="line-235"></a> <span class='hs-keyglyph'>]</span>
<a name="line-236"></a>
<a name="line-237"></a><a name="instance%20CoArbitrary%20(Range%20v)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>CoArbitrary</span> <span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span>
<a name="line-238"></a> <span class='hs-conid'>CoArbitrary</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-239"></a>
<a name="line-240"></a> <span class='hs-varid'>coarbitrary</span> <span class='hs-layout'>(</span><span class='hs-conid'>Range</span> <span class='hs-varid'>lower</span> <span class='hs-varid'>upper</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-241"></a> <span class='hs-varid'>variant</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>coarbitrary</span> <span class='hs-varid'>lower</span> <span class='hs-varop'>.</span> <span class='hs-varid'>coarbitrary</span> <span class='hs-varid'>upper</span>
<a name="line-242"></a>
<a name="line-243"></a>
<a name="line-244"></a>
<a name="line-245"></a><span class='hs-comment'>-- QuickCheck Properties</span>
<a name="line-246"></a>
<a name="line-247"></a><a name="prop_unionRange"></a><span class='hs-comment'>-- | The union of two ranges has a value iff either range has it.</span>
<a name="line-248"></a><span class='hs-comment'>--</span>
<a name="line-249"></a><span class='hs-comment'>-- > prop_unionRange r1 r2 n =</span>
<a name="line-250"></a><span class='hs-comment'>-- > (r1 `rangeHas` n || r2 `rangeHas` n)</span>
<a name="line-251"></a><span class='hs-comment'>-- > == (r1 `rangeUnion` r2) `rangeListHas` n</span>
<a name="line-252"></a><span class='hs-definition'>prop_unionRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-253"></a><span class='hs-definition'>prop_unionRange</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span>
<a name="line-254"></a> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span> <span class='hs-varop'>`rangeHas`</span> <span class='hs-varid'>n</span> <span class='hs-varop'>||</span> <span class='hs-varid'>r2</span> <span class='hs-varop'>`rangeHas`</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-255"></a> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span> <span class='hs-varop'>`rangeUnion`</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-varop'>`rangeListHas`</span> <span class='hs-varid'>n</span>
<a name="line-256"></a>
<a name="line-257"></a><a name="prop_unionRangeLength"></a><span class='hs-comment'>-- | The union of two ranges always contains one or two ranges.</span>
<a name="line-258"></a><span class='hs-comment'>--</span>
<a name="line-259"></a><span class='hs-comment'>-- > prop_unionRangeLength r1 r2 = (n == 1) || (n == 2)</span>
<a name="line-260"></a><span class='hs-comment'>-- > where n = length $ rangeUnion r1 r2</span>
<a name="line-261"></a><span class='hs-definition'>prop_unionRangeLength</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-262"></a><span class='hs-definition'>prop_unionRangeLength</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</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'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span> <span class='hs-varop'>==</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-263"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varop'>$</span> <span class='hs-varid'>rangeUnion</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span>
<a name="line-264"></a>
<a name="line-265"></a><a name="prop_intersectionRange"></a><span class='hs-comment'>-- | The intersection of two ranges has a value iff both ranges have it.</span>
<a name="line-266"></a><span class='hs-comment'>--</span>
<a name="line-267"></a><span class='hs-comment'>-- > prop_intersectionRange r1 r2 n =</span>
<a name="line-268"></a><span class='hs-comment'>-- > (r1 `rangeHas` n && r2 `rangeHas` n)</span>
<a name="line-269"></a><span class='hs-comment'>-- > == (r1 `rangeIntersection` r2) `rangeHas` n</span>
<a name="line-270"></a><span class='hs-definition'>prop_intersectionRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-271"></a><span class='hs-definition'>prop_intersectionRange</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span>
<a name="line-272"></a> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span> <span class='hs-varop'>`rangeHas`</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>r2</span> <span class='hs-varop'>`rangeHas`</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-273"></a> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span> <span class='hs-varop'>`rangeIntersection`</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-varop'>`rangeHas`</span> <span class='hs-varid'>n</span>
<a name="line-274"></a>
<a name="line-275"></a><a name="prop_differenceRange"></a><span class='hs-comment'>-- | The difference of two ranges has a value iff the first range has it and</span>
<a name="line-276"></a><span class='hs-comment'>-- the second does not.</span>
<a name="line-277"></a><span class='hs-comment'>--</span>
<a name="line-278"></a><span class='hs-comment'>-- > prop_differenceRange r1 r2 n =</span>
<a name="line-279"></a><span class='hs-comment'>-- > (r1 `rangeHas` n && not (r2 `rangeHas` n))</span>
<a name="line-280"></a><span class='hs-comment'>-- > == (r1 `rangeDifference` r2) `rangeListHas` n</span>
<a name="line-281"></a><span class='hs-definition'>prop_differenceRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-282"></a><span class='hs-definition'>prop_differenceRange</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span>
<a name="line-283"></a> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span> <span class='hs-varop'>`rangeHas`</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>r2</span> <span class='hs-varop'>`rangeHas`</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-284"></a> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span> <span class='hs-varop'>`rangeDifference`</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-varop'>`rangeListHas`</span> <span class='hs-varid'>n</span>
<a name="line-285"></a>
<a name="line-286"></a><a name="prop_intersectionOverlap"></a><span class='hs-comment'>-- | Iff two ranges overlap then their intersection is non-empty.</span>
<a name="line-287"></a><span class='hs-comment'>--</span>
<a name="line-288"></a><span class='hs-comment'>-- > prop_intersectionOverlap r1 r2 =</span>
<a name="line-289"></a><span class='hs-comment'>-- > (rangeIsEmpty $ rangeIntersection r1 r2) == (rangeOverlap r1 r2)</span>
<a name="line-290"></a><span class='hs-definition'>prop_intersectionOverlap</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-291"></a><span class='hs-definition'>prop_intersectionOverlap</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span>
<a name="line-292"></a> <span class='hs-layout'>(</span><span class='hs-varid'>rangeIsEmpty</span> <span class='hs-varop'>$</span> <span class='hs-varid'>rangeIntersection</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>rangeOverlap</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span>
<a name="line-293"></a>
<a name="line-294"></a><a name="prop_enclosureUnion"></a><span class='hs-comment'>-- | Range enclosure makes union an identity function.</span>
<a name="line-295"></a><span class='hs-comment'>--</span>
<a name="line-296"></a><span class='hs-comment'>-- > prop_enclosureUnion r1 r2 =</span>
<a name="line-297"></a><span class='hs-comment'>-- > rangeEncloses r1 r2 == (rangeUnion r1 r2 == [r1])</span>
<a name="line-298"></a><span class='hs-definition'>prop_enclosureUnion</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Range</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-299"></a><span class='hs-definition'>prop_enclosureUnion</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rangeEncloses</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>rangeUnion</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span> <span class='hs-varop'>==</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r1</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-300"></a>
<a name="line-301"></a><a name="prop_singletonRangeHas"></a><span class='hs-comment'>-- | Range Singleton has its member.</span>
<a name="line-302"></a><span class='hs-comment'>--</span>
<a name="line-303"></a><span class='hs-comment'>-- > prop_singletonRangeHas v = singletonRange v `rangeHas` v</span>
<a name="line-304"></a><span class='hs-definition'>prop_singletonRangeHas</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-305"></a><span class='hs-definition'>prop_singletonRangeHas</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>singletonRange</span> <span class='hs-varid'>v</span> <span class='hs-varop'>`rangeHas`</span> <span class='hs-varid'>v</span>
<a name="line-306"></a>
<a name="line-307"></a><a name="prop_singletonRangeHasOnly"></a><span class='hs-comment'>-- | Range Singleton has only its member.</span>
<a name="line-308"></a><span class='hs-comment'>--</span>
<a name="line-309"></a><span class='hs-comment'>-- > prop_singletonHasOnly v1 v2 =</span>
<a name="line-310"></a><span class='hs-comment'>-- > (v1 == v2) == (singletonRange v1 `rangeHas` v2)</span>
<a name="line-311"></a><span class='hs-definition'>prop_singletonRangeHasOnly</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-312"></a><span class='hs-definition'>prop_singletonRangeHasOnly</span> <span class='hs-varid'>v1</span> <span class='hs-varid'>v2</span> <span class='hs-keyglyph'>=</span>
<a name="line-313"></a> <span class='hs-layout'>(</span><span class='hs-varid'>v1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-varid'>singletonRange</span> <span class='hs-varid'>v1</span> <span class='hs-varop'>`rangeHas`</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span>
<a name="line-314"></a>
<a name="line-315"></a><a name="prop_singletonRangeConverse"></a><span class='hs-comment'>-- | A singleton range can have its value extracted.</span>
<a name="line-316"></a><span class='hs-comment'>--</span>
<a name="line-317"></a><span class='hs-comment'>-- > prop_singletonRangeConverse v =</span>
<a name="line-318"></a><span class='hs-comment'>-- > rangeSingletonValue (singletonRange v) == Just v</span>
<a name="line-319"></a><span class='hs-definition'>prop_singletonRangeConverse</span><span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DiscreteOrdered</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span>
<a name="line-320"></a><span class='hs-definition'>prop_singletonRangeConverse</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span>
<a name="line-321"></a> <span class='hs-varid'>rangeSingletonValue</span> <span class='hs-layout'>(</span><span class='hs-varid'>singletonRange</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>v</span>
<a name="line-322"></a>
<a name="line-323"></a><a name="prop_emptyNonSingleton"></a><span class='hs-comment'>-- | The empty range is not a singleton.</span>
<a name="line-324"></a><span class='hs-comment'>--</span>
<a name="line-325"></a><span class='hs-comment'>-- > prop_emptyNonSingleton = rangeSingletonValue emptyRange == Nothing</span>
<a name="line-326"></a><span class='hs-definition'>prop_emptyNonSingleton</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-327"></a><span class='hs-definition'>prop_emptyNonSingleton</span> <span class='hs-keyglyph'>=</span>
<a name="line-328"></a> <span class='hs-varid'>rangeSingletonValue</span> <span class='hs-layout'>(</span><span class='hs-varid'>emptyRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Nothing</span>
<a name="line-329"></a>
<a name="line-330"></a><a name="prop_fullNonSingleton"></a><span class='hs-comment'>-- | The full range is not a singleton.</span>
<a name="line-331"></a><span class='hs-comment'>--</span>
<a name="line-332"></a><span class='hs-comment'>-- > prop_fullNonSingleton = rangeSingletonValue fullRange == Nothing</span>
<a name="line-333"></a><span class='hs-definition'>prop_fullNonSingleton</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>
<a name="line-334"></a><span class='hs-definition'>prop_fullNonSingleton</span> <span class='hs-keyglyph'>=</span>
<a name="line-335"></a> <span class='hs-varid'>rangeSingletonValue</span> <span class='hs-layout'>(</span><span class='hs-varid'>fullRange</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Range</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Nothing</span>
<a name="line-336"></a>
<a name="line-337"></a><a name="prop_nonSingleton"></a><span class='hs-comment'>-- | For real x and y, @x < y@ implies that any range between them is a</span>
<a name="line-338"></a><span class='hs-comment'>-- non-singleton.</span>
<a name="line-339"></a><span class='hs-definition'>prop_nonSingleton</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Double</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Double</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Property</span>
<a name="line-340"></a><span class='hs-definition'>prop_nonSingleton</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'><</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varop'>==></span> <span class='hs-varid'>null</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mapMaybe</span> <span class='hs-varid'>rangeSingletonValue</span> <span class='hs-varid'>rs</span>
<a name="line-341"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>rs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span>
<a name="line-342"></a> <span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-343"></a> <span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-344"></a> <span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-345"></a> <span class='hs-conid'>Range</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-346"></a>
<a name="line-347"></a>
<a name="line-348"></a><a name="prop_intSingleton"></a><span class='hs-comment'>-- | For all integers x and y, any range formed from boundaries on either side</span>
<a name="line-349"></a><span class='hs-comment'>-- of x and y is a singleton iff it contains exactly one integer.</span>
<a name="line-350"></a><span class='hs-definition'>prop_intSingleton</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Property</span>
<a name="line-351"></a><span class='hs-definition'>prop_intSingleton</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>forAll</span> <span class='hs-layout'>(</span><span class='hs-varid'>rangeAround</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></span>
<a name="line-352"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>filter</span> <span class='hs-layout'>(</span><span class='hs-varid'>rangeHas</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-comment'>-</span><span class='hs-num'>1</span> <span class='hs-keyglyph'>..</span> <span class='hs-varid'>y</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>of</span>
<a name="line-353"></a> <span class='hs-keyglyph'>[</span><span class='hs-varid'>v</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>rangeSingletonValue</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>v</span>
<a name="line-354"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>rangeSingletonValue</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Nothing</span>
<a name="line-355"></a> <span class='hs-keyword'>where</span>
<a name="line-356"></a> <span class='hs-varid'>rangeAround</span> <span class='hs-varid'>v1</span> <span class='hs-varid'>v2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>Range</span> <span class='hs-varop'>`ap`</span> <span class='hs-varid'>genBound</span> <span class='hs-varid'>v1</span> <span class='hs-varop'>`ap`</span> <span class='hs-varid'>genBound</span> <span class='hs-varid'>v2</span>
<a name="line-357"></a> <span class='hs-varid'>genBound</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>elements</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>BoundaryAbove</span> <span class='hs-varid'>v</span><span class='hs-layout'>,</span> <span class='hs-conid'>BoundaryBelow</span> <span class='hs-varid'>v</span><span class='hs-keyglyph'>]</span>
<a name="line-358"></a>
<a name="line-359"></a>
</pre></body>
</html>
|