This file is indexed.

/usr/share/doc/libghc-unordered-containers-doc/html/src/Data-HashMap-Common.html is in libghc-unordered-containers-doc 0.1.4.6-3.

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
<?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/HashMap/Common.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE BangPatterns, CPP, DeriveDataTypeable #-}</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-comment'>-- | Code shared between the lazy and strict versions.</span>
<a name="line-4"></a>
<a name="line-5"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>HashMap</span><span class='hs-varop'>.</span><span class='hs-conid'>Common</span>
<a name="line-6"></a>    <span class='hs-layout'>(</span>
<a name="line-7"></a>      <span class='hs-comment'>-- * Types</span>
<a name="line-8"></a>      <span class='hs-conid'>HashMap</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-9"></a>
<a name="line-10"></a>      <span class='hs-comment'>-- * Helpers</span>
<a name="line-11"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>join</span>
<a name="line-12"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>bin</span>
<a name="line-13"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>zero</span>
<a name="line-14"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>nomatch</span>
<a name="line-15"></a>
<a name="line-16"></a>    <span class='hs-comment'>-- * Construction</span>
<a name="line-17"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>empty</span>
<a name="line-18"></a>
<a name="line-19"></a>    <span class='hs-comment'>-- * Combine</span>
<a name="line-20"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>union</span>
<a name="line-21"></a>
<a name="line-22"></a>    <span class='hs-comment'>-- * Transformations</span>
<a name="line-23"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>toList</span>
<a name="line-24"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>filterMapWithKey</span>
<a name="line-25"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>traverseWithKey</span>
<a name="line-26"></a>
<a name="line-27"></a>    <span class='hs-comment'>-- * Folds</span>
<a name="line-28"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>foldrWithKey</span>
<a name="line-29"></a>
<a name="line-30"></a>    <span class='hs-comment'>-- * Helpers</span>
<a name="line-31"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>shorter</span>
<a name="line-32"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>insertCollidingWith</span>
<a name="line-33"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-34"></a>
<a name="line-35"></a><span class='hs-cpp'>#include "MachDeps.h"</span>
<a name="line-36"></a>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>Applicative</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>&lt;*&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>pure</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;$&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>DeepSeq</span> <span class='hs-layout'>(</span><span class='hs-conid'>NFData</span><span class='hs-layout'>(</span><span class='hs-varid'>rnf</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Bits</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bits</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>.&amp;.</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>xor</span><span class='hs-layout'>)</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Foldable</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Foldable</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>Monoid</span><span class='hs-layout'>(</span><span class='hs-varid'>mempty</span><span class='hs-layout'>,</span> <span class='hs-varid'>mappend</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Traversable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Traversable</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Typeable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Word</span> <span class='hs-layout'>(</span><span class='hs-conid'>Word</span><span class='hs-layout'>)</span>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldr</span><span class='hs-layout'>,</span> <span class='hs-varid'>map</span><span class='hs-layout'>)</span>
<a name="line-46"></a>
<a name="line-47"></a><span class='hs-cpp'>#if defined(__GLASGOW_HASKELL__)</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Exts</span> <span class='hs-layout'>(</span><span class='hs-varid'>build</span><span class='hs-layout'>)</span>
<a name="line-49"></a><span class='hs-cpp'>#endif</span>
<a name="line-50"></a>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>FullList</span><span class='hs-varop'>.</span><span class='hs-conid'>Lazy</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>FL</span>
<a name="line-52"></a>
<a name="line-53"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-54"></a><span class='hs-comment'>-- * The 'HashMap' type</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="HashMap"></a><span class='hs-comment'>-- | A map from keys to values.  A map cannot contain duplicate keys;</span>
<a name="line-57"></a><a name="HashMap"></a><span class='hs-comment'>-- each key can map to at most one value.</span>
<a name="line-58"></a><a name="HashMap"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span>
<a name="line-59"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>SuffixMask</span>
<a name="line-60"></a>          <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-61"></a>          <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-62"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Tip</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Hash</span>
<a name="line-63"></a>          <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>FullList</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-64"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Nil</span>
<a name="line-65"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-66"></a>
<a name="line-67"></a><a name="Suffix"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Suffix</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
<a name="line-68"></a><a name="Hash"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Hash</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
<a name="line-69"></a>
<a name="line-70"></a><a name="SuffixMask"></a><span class='hs-comment'>-- | A SuffixMask stores a path to a Bin node in the hash map.  The</span>
<a name="line-71"></a><a name="SuffixMask"></a><span class='hs-comment'>-- uppermost set bit, the Mask, indicates the bit used to distinguish</span>
<a name="line-72"></a><a name="SuffixMask"></a><span class='hs-comment'>-- hashes in the left and right subtrees.  The lower-order bits (below</span>
<a name="line-73"></a><a name="SuffixMask"></a><span class='hs-comment'>-- the highest set bit), the Suffix, are set the same way in all the</span>
<a name="line-74"></a><a name="SuffixMask"></a><span class='hs-comment'>-- hashes contained in this subtree of the map.  Thus, hashes in the</span>
<a name="line-75"></a><a name="SuffixMask"></a><span class='hs-comment'>-- right subtree will match all the bits in the SuffixMask, but may</span>
<a name="line-76"></a><a name="SuffixMask"></a><span class='hs-comment'>-- have set bits above the Mask.  Hashes in the left subtree will not</span>
<a name="line-77"></a><a name="SuffixMask"></a><span class='hs-comment'>-- match the Mask bit, but will match all the Suffix bits.</span>
<a name="line-78"></a><a name="SuffixMask"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>SuffixMask</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
<a name="line-79"></a>
<a name="line-80"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-81"></a><span class='hs-comment'>-- * Instances</span>
<a name="line-82"></a>
<a name="line-83"></a><span class='hs-comment'>-- Since both the lazy and the strict API shares one data type we can</span>
<a name="line-84"></a><span class='hs-comment'>-- only provide one set of instances.  We provide the lazy ones.</span>
<a name="line-85"></a>
<a name="line-86"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-87"></a>    <span class='hs-varid'>t1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>equal</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span>
<a name="line-88"></a>    <span class='hs-varid'>t1</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nequal</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span>
<a name="line-89"></a>
<a name="line-90"></a><a name="toList"></a><span class='hs-comment'>-- | /O(n)/ Return a list of this map's elements.  The list is</span>
<a name="line-91"></a><span class='hs-comment'>-- produced lazily.</span>
<a name="line-92"></a><span class='hs-definition'>toList</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-93"></a><span class='hs-cpp'>#if defined(__GLASGOW_HASKELL__)</span>
<a name="line-94"></a><span class='hs-definition'>toList</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>build</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span> <span class='hs-varid'>c</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>foldrWithKey</span> <span class='hs-layout'>(</span><span class='hs-varid'>curry</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>z</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-95"></a><span class='hs-cpp'>#else</span>
<a name="line-96"></a><span class='hs-definition'>toList</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldrWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span>
<a name="line-97"></a><span class='hs-cpp'>#endif</span>
<a name="line-98"></a><span class='hs-comment'>{-# INLINE toList #-}</span>
<a name="line-99"></a>
<a name="line-100"></a><a name="equal"></a><span class='hs-definition'>equal</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-101"></a><span class='hs-definition'>equal</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>r1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>l2</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-102"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>sm1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>sm2</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-layout'>(</span><span class='hs-varid'>equal</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>l2</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-layout'>(</span><span class='hs-varid'>equal</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span>
<a name="line-103"></a><span class='hs-definition'>equal</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h1</span> <span class='hs-varid'>l1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h2</span> <span class='hs-varid'>l2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>h1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>h2</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-layout'>(</span><span class='hs-varid'>l1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>l2</span><span class='hs-layout'>)</span>
<a name="line-104"></a><span class='hs-definition'>equal</span> <span class='hs-conid'>Nil</span> <span class='hs-conid'>Nil</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-105"></a><span class='hs-definition'>equal</span> <span class='hs-keyword'>_</span>   <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-106"></a>
<a name="line-107"></a><a name="nequal"></a><span class='hs-definition'>nequal</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-108"></a><span class='hs-definition'>nequal</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>r1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>l2</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-109"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>sm1</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>sm2</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <span class='hs-layout'>(</span><span class='hs-varid'>nequal</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>l2</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <span class='hs-layout'>(</span><span class='hs-varid'>nequal</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span>
<a name="line-110"></a><span class='hs-definition'>nequal</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h1</span> <span class='hs-varid'>l1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h2</span> <span class='hs-varid'>l2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>h1</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>h2</span><span class='hs-layout'>)</span> <span class='hs-varop'>||</span> <span class='hs-layout'>(</span><span class='hs-varid'>l1</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>l2</span><span class='hs-layout'>)</span>
<a name="line-111"></a><span class='hs-definition'>nequal</span> <span class='hs-conid'>Nil</span> <span class='hs-conid'>Nil</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-112"></a><span class='hs-definition'>nequal</span> <span class='hs-keyword'>_</span>   <span class='hs-keyword'>_</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-113"></a>
<a name="line-114"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>NFData</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>NFData</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>NFData</span> <span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-115"></a>    <span class='hs-varid'>rnf</span> <span class='hs-conid'>Nil</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>()</span>
<a name="line-116"></a>    <span class='hs-varid'>rnf</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnf</span> <span class='hs-varid'>xs</span>
<a name="line-117"></a>    <span class='hs-varid'>rnf</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rnf</span> <span class='hs-varid'>l</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>rnf</span> <span class='hs-varid'>r</span>
<a name="line-118"></a>
<a name="line-119"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-120"></a>    <span class='hs-varid'>fmap</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span>
<a name="line-121"></a>
<a name="line-122"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span> <span class='hs-varid'>k</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'>=&gt;</span> <span class='hs-conid'>Show</span> <span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-123"></a>    <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>d</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showParen</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>10</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-124"></a>      <span class='hs-varid'>showString</span> <span class='hs-str'>"fromList "</span> <span class='hs-varop'>.</span> <span class='hs-varid'>shows</span> <span class='hs-layout'>(</span><span class='hs-varid'>toList</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-125"></a>
<a name="line-126"></a><a name="map"></a><span class='hs-comment'>-- | /O(n)/ Transform this map by applying a function to every value.</span>
<a name="line-127"></a><span class='hs-definition'>map</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>v1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v2</span>
<a name="line-128"></a><span class='hs-definition'>map</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span>
<a name="line-129"></a>  <span class='hs-keyword'>where</span>
<a name="line-130"></a>    <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-131"></a>    <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-varid'>map</span> <span class='hs-varid'>f'</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-132"></a>    <span class='hs-varid'>go</span> <span class='hs-conid'>Nil</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nil</span>
<a name="line-133"></a>    <span class='hs-varid'>f'</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>f</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-134"></a><span class='hs-comment'>{-# INLINE map #-}</span>
<a name="line-135"></a>
<a name="line-136"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Foldable</span><span class='hs-varop'>.</span><span class='hs-conid'>Foldable</span> <span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-137"></a>    <span class='hs-varid'>foldr</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldrWithKey</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-138"></a>
<a name="line-139"></a><a name="foldrWithKey"></a><span class='hs-comment'>-- | /O(n)/ Reduce this map by applying a binary operator to all</span>
<a name="line-140"></a><span class='hs-comment'>-- elements, using the given starting value (typically the</span>
<a name="line-141"></a><span class='hs-comment'>-- right-identity of the operator).</span>
<a name="line-142"></a><span class='hs-definition'>foldrWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
<a name="line-143"></a><span class='hs-definition'>foldrWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span>
<a name="line-144"></a>  <span class='hs-keyword'>where</span>
<a name="line-145"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span>
<a name="line-146"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-varid'>foldrWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>l</span>
<a name="line-147"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-conid'>Nil</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span>
<a name="line-148"></a><span class='hs-comment'>{-# INLINE foldrWithKey #-}</span>
<a name="line-149"></a>
<a name="line-150"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-151"></a>  <span class='hs-varid'>mempty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-152"></a>  <span class='hs-comment'>{-# INLINE mempty #-}</span>
<a name="line-153"></a>  <span class='hs-varid'>mappend</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>union</span>
<a name="line-154"></a>  <span class='hs-comment'>{-# INLINE mappend #-}</span>
<a name="line-155"></a>
<a name="line-156"></a><a name="empty"></a><span class='hs-comment'>-- | /O(1)/ Construct an empty map.</span>
<a name="line-157"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span>
<a name="line-158"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nil</span>
<a name="line-159"></a>
<a name="line-160"></a><a name="union"></a><span class='hs-comment'>-- | /O(n+m)/ The union of two maps.  If a key occurs in both maps,</span>
<a name="line-161"></a><span class='hs-comment'>-- the mapping from the first will be the mapping in the result.</span>
<a name="line-162"></a><span class='hs-definition'>union</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span>
<a name="line-163"></a><span class='hs-definition'>union</span> <span class='hs-varid'>t1</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>r1</span><span class='hs-layout'>)</span> <span class='hs-varid'>t2</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>l2</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span>
<a name="line-164"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>sm1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>sm2</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm1</span> <span class='hs-layout'>(</span><span class='hs-varid'>union</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>l2</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>union</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span>
<a name="line-165"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>shorter</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>sm2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>union1</span>
<a name="line-166"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>shorter</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>sm1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>union2</span>
<a name="line-167"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>t2</span>
<a name="line-168"></a>  <span class='hs-keyword'>where</span>
<a name="line-169"></a>    <span class='hs-varid'>union1</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>nomatch</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>sm1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>t2</span>
<a name="line-170"></a>           <span class='hs-keyglyph'>|</span> <span class='hs-varid'>zero</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>sm1</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm1</span> <span class='hs-layout'>(</span><span class='hs-varid'>union</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-varid'>r1</span>
<a name="line-171"></a>           <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>l1</span> <span class='hs-layout'>(</span><span class='hs-varid'>union</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span>
<a name="line-172"></a>
<a name="line-173"></a>    <span class='hs-varid'>union2</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>nomatch</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>sm2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>t2</span>
<a name="line-174"></a>           <span class='hs-keyglyph'>|</span> <span class='hs-varid'>zero</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>sm2</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm2</span> <span class='hs-layout'>(</span><span class='hs-varid'>union</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>l2</span><span class='hs-layout'>)</span> <span class='hs-varid'>r2</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'>Bin</span> <span class='hs-varid'>sm2</span> <span class='hs-varid'>l2</span> <span class='hs-layout'>(</span><span class='hs-varid'>union</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span>
<a name="line-176"></a><span class='hs-definition'>union</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertCollidingL</span> <span class='hs-varid'>h</span> <span class='hs-varid'>l</span> <span class='hs-varid'>t</span>
<a name="line-177"></a><span class='hs-definition'>union</span> <span class='hs-varid'>t</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertCollidingR</span> <span class='hs-varid'>h</span> <span class='hs-varid'>l</span> <span class='hs-varid'>t</span>  <span class='hs-comment'>-- right bias</span>
<a name="line-178"></a><span class='hs-definition'>union</span> <span class='hs-conid'>Nil</span> <span class='hs-varid'>t</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span>
<a name="line-179"></a><span class='hs-definition'>union</span> <span class='hs-varid'>t</span> <span class='hs-conid'>Nil</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span>
<a name="line-180"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ &gt;= 700</span>
<a name="line-181"></a><span class='hs-comment'>{-# INLINABLE union #-}</span>
<a name="line-182"></a><span class='hs-cpp'>#endif</span>
<a name="line-183"></a>
<a name="line-184"></a><a name="insertCollidingL"></a><span class='hs-comment'>-- | Insert a list of key-value pairs which keys all hash to the same</span>
<a name="line-185"></a><span class='hs-comment'>-- hash value.  Prefer key-value pairs in the list to key-value pairs</span>
<a name="line-186"></a><span class='hs-comment'>-- already in the map.</span>
<a name="line-187"></a><span class='hs-definition'>insertCollidingL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Hash</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>FullList</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span>
<a name="line-188"></a><span class='hs-definition'>insertCollidingL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertCollidingWith</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-varid'>union</span>
<a name="line-189"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ &gt;= 700</span>
<a name="line-190"></a><span class='hs-comment'>{-# INLINABLE insertCollidingL #-}</span>
<a name="line-191"></a><span class='hs-cpp'>#endif</span>
<a name="line-192"></a>
<a name="line-193"></a><a name="insertCollidingR"></a><span class='hs-comment'>-- | Insert a list of key-value pairs which keys all hash to the same</span>
<a name="line-194"></a><span class='hs-comment'>-- hash value.  Prefer key-value pairs already in the map to key-value</span>
<a name="line-195"></a><span class='hs-comment'>-- pairs in the list.</span>
<a name="line-196"></a><span class='hs-definition'>insertCollidingR</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Hash</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>FullList</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span>
<a name="line-197"></a><span class='hs-definition'>insertCollidingR</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertCollidingWith</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-varid'>union</span><span class='hs-layout'>)</span>
<a name="line-198"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ &gt;= 700</span>
<a name="line-199"></a><span class='hs-comment'>{-# INLINABLE insertCollidingR #-}</span>
<a name="line-200"></a><span class='hs-cpp'>#endif</span>
<a name="line-201"></a>
<a name="line-202"></a><a name="insertCollidingWith"></a><span class='hs-comment'>-- | Insert a list of key-value pairs which keys all hash to the same</span>
<a name="line-203"></a><span class='hs-comment'>-- hash value.  Merge the list of key-value pairs to be inserted @xs@</span>
<a name="line-204"></a><span class='hs-comment'>-- with any existing key-values pairs @ys@ by applying @f xs ys@.</span>
<a name="line-205"></a><span class='hs-definition'>insertCollidingWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span>
<a name="line-206"></a>                    <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>FullList</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>FullList</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>FullList</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-207"></a>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Hash</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>FullList</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span>
<a name="line-208"></a>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span>
<a name="line-209"></a><span class='hs-definition'>insertCollidingWith</span> <span class='hs-varid'>f</span> <span class='hs-varid'>h0</span> <span class='hs-varid'>l0</span> <span class='hs-varid'>t0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>h0</span> <span class='hs-varid'>l0</span> <span class='hs-varid'>t0</span>
<a name="line-210"></a>  <span class='hs-keyword'>where</span>
<a name="line-211"></a>    <span class='hs-varid'>go</span> <span class='hs-varop'>!</span><span class='hs-varid'>h</span> <span class='hs-varop'>!</span><span class='hs-varid'>xs</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-212"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>nomatch</span> <span class='hs-varid'>h</span> <span class='hs-varid'>sm</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varid'>sm</span> <span class='hs-varid'>t</span>
<a name="line-213"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>zero</span> <span class='hs-varid'>h</span> <span class='hs-varid'>sm</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>h</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span>
<a name="line-214"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>h</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-215"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>h</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h'</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-216"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>h</span> <span class='hs-varop'>==</span> <span class='hs-varid'>h'</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varop'>$</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>l</span>
<a name="line-217"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varid'>h'</span> <span class='hs-varid'>t</span>
<a name="line-218"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>h</span> <span class='hs-varid'>xs</span> <span class='hs-conid'>Nil</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varid'>xs</span>
<a name="line-219"></a><span class='hs-comment'>{-# INLINE insertCollidingWith #-}</span>
<a name="line-220"></a>
<a name="line-221"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Traversable</span> <span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-222"></a>  <span class='hs-varid'>traverse</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>traverseWithKey</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-223"></a>
<a name="line-224"></a><a name="filterMapWithKey"></a><span class='hs-comment'>-- | /O(n)/ Transform this map by applying a function to every value;</span>
<a name="line-225"></a><span class='hs-comment'>-- when f k v returns Just x, keep an entry mapping k to x, otherwise</span>
<a name="line-226"></a><span class='hs-comment'>-- do not include k in the result.</span>
<a name="line-227"></a><span class='hs-definition'>filterMapWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v2</span>
<a name="line-228"></a><span class='hs-definition'>filterMapWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span>
<a name="line-229"></a>  <span class='hs-keyword'>where</span>
<a name="line-230"></a>    <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bin</span> <span class='hs-varid'>sm</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-231"></a>    <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varid'>vs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-232"></a>      <span class='hs-keyword'>case</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-varid'>foldrWithKey</span> <span class='hs-varid'>ff</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>Nil</span> <span class='hs-varid'>vs</span> <span class='hs-keyword'>of</span>
<a name="line-233"></a>        <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>Nil</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nil</span>
<a name="line-234"></a>        <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>FL</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
<a name="line-235"></a>    <span class='hs-varid'>go</span> <span class='hs-conid'>Nil</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nil</span>
<a name="line-236"></a>    <span class='hs-varid'>ff</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span>
<a name="line-237"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyword'>of</span>
<a name="line-238"></a>        <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>xs</span>
<a name="line-239"></a>        <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-conid'>Cons</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span>
<a name="line-240"></a><span class='hs-comment'>{-# INLINE filterMapWithKey #-}</span>
<a name="line-241"></a>
<a name="line-242"></a><a name="traverseWithKey"></a><span class='hs-comment'>-- | /O(n)/ Transform this map by accumulating an Applicative result</span>
<a name="line-243"></a><span class='hs-comment'>-- from every value.</span>
<a name="line-244"></a><span class='hs-definition'>traverseWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Applicative</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v1</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v1</span>
<a name="line-245"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span>
<a name="line-246"></a><span class='hs-definition'>traverseWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span>
<a name="line-247"></a>  <span class='hs-keyword'>where</span>
<a name="line-248"></a>    <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span>
<a name="line-249"></a>    <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>h</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-conid'>FL</span><span class='hs-varop'>.</span><span class='hs-varid'>traverseWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>l</span>
<a name="line-250"></a>    <span class='hs-varid'>go</span> <span class='hs-conid'>Nil</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pure</span> <span class='hs-conid'>Nil</span>
<a name="line-251"></a><span class='hs-comment'>{-# INLINE traverseWithKey #-}</span>
<a name="line-252"></a>
<a name="line-253"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-254"></a><span class='hs-comment'>-- Helpers</span>
<a name="line-255"></a>
<a name="line-256"></a><a name="join"></a><span class='hs-definition'>join</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Suffix</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Suffix</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span>
<a name="line-257"></a><span class='hs-definition'>join</span> <span class='hs-varid'>s1</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>s2</span> <span class='hs-varid'>t2</span>
<a name="line-258"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>zero</span> <span class='hs-varid'>s1</span> <span class='hs-varid'>sm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span>
<a name="line-259"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-varid'>t2</span> <span class='hs-varid'>t1</span>
<a name="line-260"></a>  <span class='hs-keyword'>where</span>
<a name="line-261"></a>    <span class='hs-varid'>sm</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>branchSuffixMask</span> <span class='hs-varid'>s1</span> <span class='hs-varid'>s2</span>
<a name="line-262"></a><span class='hs-comment'>{-# INLINE join #-}</span>
<a name="line-263"></a>
<a name="line-264"></a><a name="bin"></a><span class='hs-comment'>-- | @bin@ assures that we never have empty trees within a tree.</span>
<a name="line-265"></a><span class='hs-definition'>bin</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SuffixMask</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HashMap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span>
<a name="line-266"></a><span class='hs-definition'>bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-conid'>Nil</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span>
<a name="line-267"></a><span class='hs-definition'>bin</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Nil</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-268"></a><span class='hs-definition'>bin</span> <span class='hs-varid'>sm</span>  <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sm</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span>
<a name="line-269"></a><span class='hs-comment'>{-# INLINE bin #-}</span>
<a name="line-270"></a>
<a name="line-271"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-272"></a><span class='hs-comment'>-- Endian independent bit twiddling</span>
<a name="line-273"></a>
<a name="line-274"></a><a name="zero"></a><span class='hs-comment'>-- Actually detects if every set bit of sm is set in i (and returns</span>
<a name="line-275"></a><span class='hs-comment'>-- false if so).  In most cases, the Suffix will already match, and</span>
<a name="line-276"></a><span class='hs-comment'>-- this just tests the Mask.  For lookup it can send us down the wrong</span>
<a name="line-277"></a><span class='hs-comment'>-- path, but that's OK; we'll detect this when we reach a Tip and</span>
<a name="line-278"></a><span class='hs-comment'>-- don't match.  We could have checked (i .|. fromIntegral sm) /= i</span>
<a name="line-279"></a><span class='hs-comment'>-- instead.</span>
<a name="line-280"></a><span class='hs-definition'>zero</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Hash</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SuffixMask</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-281"></a><span class='hs-definition'>zero</span> <span class='hs-varid'>i</span> <span class='hs-varid'>sm</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-varid'>smi</span><span class='hs-layout'>)</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>smi</span>
<a name="line-282"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>smi</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>sm</span>
<a name="line-283"></a><span class='hs-comment'>{-# INLINE zero #-}</span>
<a name="line-284"></a>
<a name="line-285"></a><a name="nomatch"></a><span class='hs-comment'>-- We want to detect Suffix bits in the Hash that differ from</span>
<a name="line-286"></a><span class='hs-comment'>-- SuffixMask.  To do this, we find the first bit that differs between</span>
<a name="line-287"></a><span class='hs-comment'>-- Hash and SuffixMask, then check if that bit is smaller than the</span>
<a name="line-288"></a><span class='hs-comment'>-- Mask bit.  We do this by observing that if we set this bit and all</span>
<a name="line-289"></a><span class='hs-comment'>-- bits to its right, we'll obtain a number &gt;= the suffixmask if all</span>
<a name="line-290"></a><span class='hs-comment'>-- bits are the same (cb == 0, setting all bits) or if the first bit of</span>
<a name="line-291"></a><span class='hs-comment'>-- difference is &gt;= the Mask.  Note: this comparison must be unsigned.</span>
<a name="line-292"></a><span class='hs-definition'>nomatch</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Hash</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SuffixMask</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-293"></a><span class='hs-definition'>nomatch</span> <span class='hs-varid'>i</span> <span class='hs-varid'>sm</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>cb</span> <span class='hs-varop'>+</span> <span class='hs-varid'>cb</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>sm</span>
<a name="line-294"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>cb</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>differentBit</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>sm</span><span class='hs-layout'>)</span>
<a name="line-295"></a><span class='hs-comment'>{-# INLINE nomatch #-}</span>
<a name="line-296"></a>
<a name="line-297"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-298"></a><span class='hs-comment'>-- Big endian operations</span>
<a name="line-299"></a>
<a name="line-300"></a><a name="differentBit"></a><span class='hs-comment'>-- | Compute the first (lowest-order) bit at which h1 and h2 differ.</span>
<a name="line-301"></a><span class='hs-comment'>-- This is the mask that distinguishes them.</span>
<a name="line-302"></a><span class='hs-definition'>differentBit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Hash</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Hash</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Word</span>
<a name="line-303"></a><span class='hs-definition'>differentBit</span> <span class='hs-varid'>h1</span> <span class='hs-varid'>h2</span> <span class='hs-keyglyph'>=</span>
<a name="line-304"></a>  <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>critBit</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>h1</span> <span class='hs-varop'>`xor`</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>h2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-305"></a>
<a name="line-306"></a><a name="suffixW"></a><span class='hs-comment'>-- | Given mask bit m expressed as a word, compute the suffix bits of</span>
<a name="line-307"></a><span class='hs-comment'>-- hash i, also expressed as a word.</span>
<a name="line-308"></a><span class='hs-definition'>suffixW</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Word</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Word</span>
<a name="line-309"></a><span class='hs-definition'>suffixW</span> <span class='hs-varid'>i</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-310"></a><span class='hs-comment'>{-# INLINE suffixW #-}</span>
<a name="line-311"></a>
<a name="line-312"></a><a name="branchSuffixMask"></a><span class='hs-comment'>-- | Given two hashes and/or SuffixMasks for which nomatch p1 p2 &amp;&amp;</span>
<a name="line-313"></a><span class='hs-comment'>-- nomatch p2 p1, compute SuffixMask that differentiates them, by</span>
<a name="line-314"></a><span class='hs-comment'>-- first computing the mask m and then using that to derive a suffix</span>
<a name="line-315"></a><span class='hs-comment'>-- from one of them (it won't matter which, as those bits are the</span>
<a name="line-316"></a><span class='hs-comment'>-- same).</span>
<a name="line-317"></a><span class='hs-definition'>branchSuffixMask</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Suffix</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Suffix</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SuffixMask</span>
<a name="line-318"></a><span class='hs-definition'>branchSuffixMask</span> <span class='hs-varid'>p1</span> <span class='hs-varid'>p2</span> <span class='hs-keyglyph'>=</span>
<a name="line-319"></a>    <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varop'>+</span> <span class='hs-varid'>suffixW</span> <span class='hs-varid'>w1</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-320"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>differentBit</span> <span class='hs-varid'>p1</span> <span class='hs-varid'>p2</span>
<a name="line-321"></a>        <span class='hs-varid'>w1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>p1</span>
<a name="line-322"></a><span class='hs-comment'>{-# INLINE branchSuffixMask #-}</span>
<a name="line-323"></a>
<a name="line-324"></a><a name="shorter"></a><span class='hs-comment'>-- | Is the mask of sm1 closer to the root of the tree (lower order)</span>
<a name="line-325"></a><span class='hs-comment'>-- than the mask of sm2?  This is actually approximate, and returns</span>
<a name="line-326"></a><span class='hs-comment'>-- junk when both sm1 and sm2 are at the same tree level.  This must</span>
<a name="line-327"></a><span class='hs-comment'>-- be disambiguated by first checking sm1==sm2, and subsequently by</span>
<a name="line-328"></a><span class='hs-comment'>-- checking nomatch in the appropriate direction (which will need to</span>
<a name="line-329"></a><span class='hs-comment'>-- happen anyway to determine if insertion or branching is</span>
<a name="line-330"></a><span class='hs-comment'>-- appropriate).</span>
<a name="line-331"></a><span class='hs-definition'>shorter</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SuffixMask</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SuffixMask</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-332"></a><span class='hs-definition'>shorter</span> <span class='hs-varid'>sm1</span> <span class='hs-varid'>sm2</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>sm1</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>sm2</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word</span><span class='hs-layout'>)</span>
<a name="line-333"></a><span class='hs-comment'>{-# INLINE shorter #-}</span>
<a name="line-334"></a>
<a name="line-335"></a><a name="critBit"></a><span class='hs-comment'>-- | Return a 'Word' whose single set bit corresponds to the lowest set bit of w.</span>
<a name="line-336"></a><span class='hs-definition'>critBit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Word</span>
<a name="line-337"></a><span class='hs-definition'>critBit</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>w</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-layout'>(</span><span class='hs-varid'>negate</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span>
<a name="line-338"></a><span class='hs-comment'>{-# INLINE critBit #-}</span>
</pre></body>
</html>