@@ -108,13 +108,6 @@ module Data.HashMap.Internal
108
108
, fromListWith
109
109
, fromListWithKey
110
110
111
- -- * Debugging
112
- , valid
113
- , Validity (.. )
114
- , Error (.. )
115
- , SubHash
116
- , SubHashPath
117
-
118
111
-- ** Internals used by the strict version
119
112
, Hash
120
113
, Bitmap
@@ -125,7 +118,10 @@ module Data.HashMap.Internal
125
118
, mask
126
119
, index
127
120
, bitsPerSubkey
121
+ , maxChildren
122
+ , isLeafOrCollision
128
123
, fullBitmap
124
+ , subkeyMask
129
125
, nextShift
130
126
, sparseIndex
131
127
, two
@@ -165,8 +161,7 @@ import Data.Functor.Identity (Identity (..))
165
161
import Data.Hashable (Hashable )
166
162
import Data.Hashable.Lifted (Hashable1 , Hashable2 )
167
163
import Data.HashMap.Internal.List (isPermutationBy , unorderedCompare )
168
- import Data.Semigroup (Semigroup (.. ), Sum (.. ),
169
- stimesIdempotentMonoid )
164
+ import Data.Semigroup (Semigroup (.. ), stimesIdempotentMonoid )
170
165
import GHC.Exts (Int (.. ), Int #, TYPE , (==#) )
171
166
import GHC.Stack (HasCallStack )
172
167
import Prelude hiding (filter , foldl , foldr , lookup , map ,
@@ -2465,89 +2460,3 @@ instance (Eq k, Hashable k) => Exts.IsList (HashMap k v) where
2465
2460
type Item (HashMap k v ) = (k , v )
2466
2461
fromList = fromList
2467
2462
toList = toList
2468
-
2469
- ------------------------------------------------------------------------
2470
- -- Debugging
2471
-
2472
- data Validity k = Invalid (Error k ) SubHashPath | Valid
2473
- deriving (Eq , Show )
2474
-
2475
- instance Semigroup (Validity k ) where
2476
- Valid <> y = y
2477
- x <> _ = x
2478
-
2479
- instance Monoid (Validity k ) where
2480
- mempty = Valid
2481
- mappend = (<>)
2482
-
2483
- data Error k
2484
- = INV1_internal_Empty
2485
- | INV2_misplaced_hash ! Hash
2486
- | INV3_key_hash_mismatch k ! Hash
2487
- | INV4_Collision_size ! Int
2488
- | INV5_Collision_duplicate_key k ! Hash
2489
- | INV6_bad_BitmapIndexed_size ! Int
2490
- | INV7_bitmap_array_size_mismatch ! Bitmap ! Int
2491
- | INV8_BitmapIndexed_invalid_single_subtree
2492
- | INV9_bad_Full_size ! Int
2493
- deriving (Eq , Show )
2494
-
2495
- -- | A part of a 'Hash' with 'bitsPerSubkey' bits.
2496
- type SubHash = Word
2497
-
2498
- type SubHashPath = [SubHash ]
2499
-
2500
- valid :: Hashable k => HashMap k v -> Validity k
2501
- valid Empty = Valid
2502
- valid t = validInternal [] t
2503
- where
2504
- validInternal p Empty = Invalid INV1_internal_Empty p
2505
- validInternal p (Leaf h l) = validHash p h <> validLeaf p h l
2506
- validInternal p (Collision h ary) = validHash p h <> validCollision p h ary
2507
- validInternal p (BitmapIndexed b ary) = validBitmapIndexed p b ary
2508
- validInternal p (Full ary) = validFull p ary
2509
-
2510
- validHash p0 h0 = go (reverse p0) h0
2511
- where
2512
- go [] ! _ = Valid
2513
- go (sh: p) h | h .&. subkeyMask == sh = go p (h `unsafeShiftR` bitsPerSubkey)
2514
- | otherwise = Invalid (INV2_misplaced_hash h0) p0
2515
-
2516
- validLeaf p h (L k _) | hash k == h = Valid
2517
- | otherwise = Invalid (INV3_key_hash_mismatch k h) p
2518
-
2519
- validCollision p h ary = validCollisionSize <> A. foldMap (validLeaf p h) ary <> distinctKeys
2520
- where
2521
- n = A. length ary
2522
- validCollisionSize | n < 2 = Invalid (INV4_Collision_size n) p
2523
- | otherwise = Valid
2524
- distinctKeys = A. foldMap (\ (L k _) -> appearsOnce k) ary
2525
- appearsOnce k | A. foldMap (\ (L k' _) -> if k' == k then Sum @ Int 1 else Sum 0 ) ary == 1 = Valid
2526
- | otherwise = Invalid (INV5_Collision_duplicate_key k h) p
2527
-
2528
- validBitmapIndexed p b ary = validArraySize <> validSubTrees p b ary
2529
- where
2530
- n = A. length ary
2531
- validArraySize | n < 1 || n >= maxChildren = Invalid (INV6_bad_BitmapIndexed_size n) p
2532
- | popCount b == n = Valid
2533
- | otherwise = Invalid (INV7_bitmap_array_size_mismatch b n) p
2534
-
2535
- validSubTrees p b ary
2536
- | A. length ary == 1
2537
- , isLeafOrCollision (A. index ary 0 )
2538
- = Invalid INV8_BitmapIndexed_invalid_single_subtree p
2539
- | otherwise = go b
2540
- where
2541
- go 0 = Valid
2542
- go b' = validInternal (fromIntegral c : p) (A. index ary i) <> go b''
2543
- where
2544
- c = countTrailingZeros b'
2545
- m = 1 `unsafeShiftL` c
2546
- i = sparseIndex b m
2547
- b'' = b' .&. complement m
2548
-
2549
- validFull p ary = validArraySize <> validSubTrees p fullBitmap ary
2550
- where
2551
- n = A. length ary
2552
- validArraySize | n == maxChildren = Valid
2553
- | otherwise = Invalid (INV9_bad_Full_size n) p
0 commit comments