Skip to content

Commit 7be935f

Browse files
authored
Refactor delete (#571)
This change slightly reduces the code size by moving a pointer-eq check to an earlier point. Only afterwards do we differentiate the alternatives for Leaf, Collision etc.
1 parent 490ae89 commit 7be935f

File tree

1 file changed

+30
-30
lines changed

1 file changed

+30
-30
lines changed

Data/HashMap/Internal.hs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,56 +1158,56 @@ unsafeInsertWithKey f k0 v0 m0 = runST (go h0 k0 v0 0 m0)
11581158
-- | \(O(\log n)\) Remove the mapping for the specified key from this map
11591159
-- if present.
11601160
delete :: Hashable k => k -> HashMap k v -> HashMap k v
1161-
delete k m = delete' (hash k) k m
1162-
{-# INLINABLE delete #-}
1161+
delete k = delete' (hash k) k
1162+
{-# INLINE delete #-}
11631163

11641164
delete' :: Eq k => Hash -> k -> HashMap k v -> HashMap k v
1165-
delete' h0 k0 m0 = deleteFromSubtree h0 k0 0 m0
1166-
{-# INLINABLE delete' #-}
1165+
delete' = deleteFromSubtree 0
1166+
{-# INLINE delete' #-}
11671167

1168-
-- | This version of 'delete' can be used on subtrees when a the
1168+
-- | This version of 'delete' can be used on a subtree when the
11691169
-- corresponding 'Shift' argument is supplied.
1170-
deleteFromSubtree :: Eq k => Hash -> k -> Shift -> HashMap k v -> HashMap k v
1171-
deleteFromSubtree !_ !_ !_ Empty = Empty
1172-
deleteFromSubtree h k _ t@(Leaf hy (L ky _))
1173-
| hy == h && ky == k = Empty
1174-
| otherwise = t
1175-
deleteFromSubtree h k s t@(BitmapIndexed b ary)
1176-
| b .&. m == 0 = t
1177-
| otherwise
1178-
= case A.index# ary i of
1170+
deleteFromSubtree :: Eq k => Shift -> Hash -> k -> HashMap k v -> HashMap k v
1171+
deleteFromSubtree !s !h !k = \case
1172+
Empty -> Empty
1173+
t@(Leaf hy (L ky _))
1174+
| hy == h && ky == k -> Empty
1175+
| otherwise -> t
1176+
t@(BitmapIndexed b ary)
1177+
| b .&. m == 0 -> t
1178+
| otherwise -> case A.index# ary i of
11791179
(# !st #) ->
1180-
case deleteFromSubtree h k (nextShift s) st of
1180+
case deleteFromSubtree (nextShift s) h k st of
11811181
Empty | A.length ary == 2
11821182
, (# l #) <- A.index# ary (otherOfOneOrZero i)
11831183
, isLeafOrCollision l
11841184
-> l
11851185
| otherwise
11861186
-> BitmapIndexed (b .&. complement m) (A.delete ary i)
1187-
st' | isLeafOrCollision st' && A.length ary == 1 -> st'
1188-
| st' `ptrEq` st -> t
1187+
st' | st' `ptrEq` st -> t
1188+
| isLeafOrCollision st' && A.length ary == 1 -> st'
11891189
| otherwise -> BitmapIndexed b (A.update ary i st')
1190-
where m = mask h s
1191-
i = sparseIndex b m
1192-
deleteFromSubtree h k s t@(Full ary) =
1190+
where m = mask h s
1191+
i = sparseIndex b m
1192+
t@(Full ary) ->
11931193
case A.index# ary i of
11941194
(# !st #) ->
1195-
case deleteFromSubtree h k (nextShift s) st of
1195+
case deleteFromSubtree (nextShift s) h k st of
11961196
Empty ->
11971197
let ary' = A.delete ary i
11981198
bm = fullBitmap .&. complement (1 `unsafeShiftL` i)
11991199
in BitmapIndexed bm ary'
12001200
st' | st' `ptrEq` st -> t
12011201
| otherwise -> Full (updateFullArray ary i st')
1202-
where i = index h s
1203-
deleteFromSubtree h k _ t@(Collision hy v)
1202+
where i = index h s
1203+
t@(Collision hy ary)
12041204
| h == hy
1205-
, Just i <- indexOf k v
1206-
= if A.length v == 2
1207-
then case A.index# v (otherOfOneOrZero i) of
1208-
(# l #) -> Leaf h l
1209-
else Collision h (A.delete v i)
1210-
| otherwise = t
1205+
, Just i <- indexOf k ary
1206+
-> if A.length ary == 2
1207+
then case A.index# ary (otherOfOneOrZero i) of
1208+
(# l #) -> Leaf h l
1209+
else Collision h (A.delete ary i)
1210+
| otherwise -> t
12111211
{-# INLINABLE deleteFromSubtree #-}
12121212

12131213
-- | Delete optimized for the case when we know the key is in the map.
@@ -1845,7 +1845,7 @@ difference = go_difference 0
18451845
go_difference s t1@(Leaf h1 (L k1 _)) t2
18461846
= lookupCont (\_ -> t1) (\_ _ -> Empty) h1 k1 s t2
18471847
go_difference _ t1 Empty = t1
1848-
go_difference s t1 (Leaf h2 (L k2 _)) = deleteFromSubtree h2 k2 s t1
1848+
go_difference s t1 (Leaf h2 (L k2 _)) = deleteFromSubtree s h2 k2 t1
18491849

18501850
go_difference s t1@(BitmapIndexed b1 ary1) (BitmapIndexed b2 ary2)
18511851
= differenceArrays s b1 ary1 t1 b2 ary2

0 commit comments

Comments
 (0)