@@ -113,7 +113,7 @@ module Data.HashMap.Internal
113
113
, Validity (.. )
114
114
, Error (.. )
115
115
, SubHash
116
- , SubHashPath ( .. )
116
+ , SubHashPath
117
117
118
118
-- ** Internals used by the strict version
119
119
, Hash
@@ -2495,24 +2495,23 @@ data Error k
2495
2495
-- | A part of a 'Hash' with 'bitsPerSubkey' bits.
2496
2496
type SubHash = Word
2497
2497
2498
- data SubHashPath = Root | Cons ! SubHash ! SubHashPath
2499
- deriving (Eq , Show )
2498
+ type SubHashPath = [SubHash ]
2500
2499
2501
2500
valid :: Hashable k => HashMap k v -> Validity k
2502
2501
valid Empty = Valid
2503
- valid t = validInternal Root t
2502
+ valid t = validInternal [] t
2504
2503
where
2505
2504
validInternal p Empty = Invalid INV1_internal_Empty p
2506
2505
validInternal p (Leaf h l) = validHash p h <> validLeaf p h l
2507
2506
validInternal p (Collision h ary) = validHash p h <> validCollision p h ary
2508
2507
validInternal p (BitmapIndexed b ary) = validBitmapIndexed p b ary
2509
2508
validInternal p (Full ary) = validFull p ary
2510
2509
2511
- validHash p0 h0 = go p0 h0
2510
+ validHash p0 h0 = go ( reverse p0) h0
2512
2511
where
2513
- go Root ! _ = Valid
2514
- go (Cons sh p) h | h .&. subkeyMask == sh = go p (h `unsafeShiftR` bitsPerSubkey)
2515
- | otherwise = Invalid (INV2_misplaced_hash h0) p0
2512
+ go [] ! _ = Valid
2513
+ go (sh : p) h | h .&. subkeyMask == sh = go p (h `unsafeShiftR` bitsPerSubkey)
2514
+ | otherwise = Invalid (INV2_misplaced_hash h0) p0
2516
2515
2517
2516
validLeaf p h (L k _) | hash k == h = Valid
2518
2517
| otherwise = Invalid (INV3_key_hash_mismatch k h) p
@@ -2540,7 +2539,7 @@ valid t = validInternal Root t
2540
2539
| otherwise = go b
2541
2540
where
2542
2541
go 0 = Valid
2543
- go b' = validInternal (Cons ( fromIntegral c) p) (A. index ary i) <> go b''
2542
+ go b' = validInternal (fromIntegral c : p) (A. index ary i) <> go b''
2544
2543
where
2545
2544
c = countTrailingZeros b'
2546
2545
m = 1 `unsafeShiftL` c
0 commit comments