-
Notifications
You must be signed in to change notification settings - Fork 102
Open
Labels
Description
unordered-containers/Data/HashMap/Internal/Array.hs
Lines 139 to 151 in 0a474c7
sameArray1 :: (a -> b -> Bool) -> Array a -> Array b -> Bool | |
sameArray1 eq !xs0 !ys0 | |
| lenxs /= lenys = False | |
| otherwise = go 0 xs0 ys0 | |
where | |
go !k !xs !ys | |
| k == lenxs = True | |
| (# x #) <- index# xs k | |
, (# y #) <- index# ys k | |
= eq x y && go (k + 1) xs ys | |
!lenxs = length xs0 | |
!lenys = length ys0 |
The sameArray1
function used in equal1
and equalKeys
compares the lengths of the two arrays as a first step. This is unnecessary because in both use-cases the lengths are known to equal because the corresponding bitmaps are the same or because the array of a Full node is known to have size maxChildren
.
unordered-containers/Data/HashMap/Internal.hs
Lines 421 to 435 in 8c20f7a
equal1 :: Eq k | |
=> (v -> v' -> Bool) | |
-> HashMap k v -> HashMap k v' -> Bool | |
equal1 eq = go | |
where | |
go Empty Empty = True | |
go (BitmapIndexed bm1 ary1) (BitmapIndexed bm2 ary2) | |
= bm1 == bm2 && A.sameArray1 go ary1 ary2 | |
go (Leaf h1 l1) (Leaf h2 l2) = h1 == h2 && leafEq l1 l2 | |
go (Full ary1) (Full ary2) = A.sameArray1 go ary1 ary2 | |
go (Collision h1 ary1) (Collision h2 ary2) | |
= h1 == h2 && isPermutationBy leafEq (A.toList ary1) (A.toList ary2) | |
go _ _ = False | |
leafEq (L k1 v1) (L k2 v2) = k1 == k2 && eq v1 v2 |