Skip to content

Commit 05e9fbf

Browse files
committed
WIP: Refactor delete
1 parent 3fa0102 commit 05e9fbf

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

Data/HashMap/Internal.hs

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,26 +1158,27 @@ 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

11681168
-- | This version of 'delete' can be used on subtrees when a 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 ->
1179+
case A.index# ary i of
11791180
(# !st #) ->
1180-
case deleteFromSubtree h k (nextShift s) st of
1181+
case deleteFromSubtree (nextShift s) h k st of
11811182
Empty | A.length ary == 2
11821183
, (# l #) <- A.index# ary (otherOfOneOrZero i)
11831184
, isLeafOrCollision l
@@ -1187,27 +1188,27 @@ deleteFromSubtree h k s t@(BitmapIndexed b ary)
11871188
st' | isLeafOrCollision st' && A.length ary == 1 -> st'
11881189
| st' `ptrEq` st -> t
11891190
| 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) =
1191+
where m = mask h s
1192+
i = sparseIndex b m
1193+
t@(Full ary) ->
11931194
case A.index# ary i of
11941195
(# !st #) ->
1195-
case deleteFromSubtree h k (nextShift s) st of
1196+
case deleteFromSubtree (nextShift s) h k st of
11961197
Empty ->
11971198
let ary' = A.delete ary i
11981199
bm = fullBitmap .&. complement (1 `unsafeShiftL` i)
11991200
in BitmapIndexed bm ary'
12001201
st' | st' `ptrEq` st -> t
12011202
| otherwise -> Full (updateFullArray ary i st')
1202-
where i = index h s
1203-
deleteFromSubtree h k _ t@(Collision hy v)
1203+
where i = index h s
1204+
t@(Collision hy v)
12041205
| h == hy
12051206
, Just i <- indexOf k v
1206-
= if A.length v == 2
1207+
-> if A.length v == 2
12071208
then case A.index# v (otherOfOneOrZero i) of
12081209
(# l #) -> Leaf h l
12091210
else Collision h (A.delete v i)
1210-
| otherwise = t
1211+
| otherwise -> t
12111212
{-# INLINABLE deleteFromSubtree #-}
12121213

12131214
-- | Delete optimized for the case when we know the key is in the map.
@@ -1845,7 +1846,7 @@ difference = go_difference 0
18451846
go_difference s t1@(Leaf h1 (L k1 _)) t2
18461847
= lookupCont (\_ -> t1) (\_ _ -> Empty) h1 k1 s t2
18471848
go_difference _ t1 Empty = t1
1848-
go_difference s t1 (Leaf h2 (L k2 _)) = deleteFromSubtree h2 k2 s t1
1849+
go_difference s t1 (Leaf h2 (L k2 _)) = deleteFromSubtree s h2 k2 t1
18491850

18501851
go_difference s t1@(BitmapIndexed b1 ary1) (BitmapIndexed b2 ary2)
18511852
= differenceArrays s b1 ary1 t1 b2 ary2

0 commit comments

Comments
 (0)