Skip to content

Commit 79b0f7e

Browse files
committed
Optimize array indexing in delete' and deleteKeyExists
1 parent 0d0697e commit 79b0f7e

File tree

1 file changed

+10
-18
lines changed

1 file changed

+10
-18
lines changed

Data/HashMap/Internal.hs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,10 +1135,9 @@ delete' h0 k0 m0 = go h0 k0 0 m0
11351135
else case st' of
11361136
Empty | A.length ary == 1 -> Empty
11371137
| A.length ary == 2 ->
1138-
case (i, A.index ary 0, A.index ary 1) of
1139-
(0, _, l) | isLeafOrCollision l -> l
1140-
(1, l, _) | isLeafOrCollision l -> l
1141-
_ -> bIndexed
1138+
case A.index ary (1 - i) of
1139+
l | isLeafOrCollision l -> l
1140+
_ -> bIndexed
11421141
| otherwise -> bIndexed
11431142
where
11441143
bIndexed = BitmapIndexed (b .&. complement m) (A.delete ary i)
@@ -1161,11 +1160,8 @@ delete' h0 k0 m0 = go h0 k0 0 m0
11611160
go h k _ t@(Collision hy v)
11621161
| h == hy = case indexOf k v of
11631162
Just i
1164-
| A.length v == 2 ->
1165-
if i == 0
1166-
then Leaf h (A.index v 1)
1167-
else Leaf h (A.index v 0)
1168-
| otherwise -> Collision h (A.delete v i)
1163+
| A.length v == 2 -> Leaf h (A.index v (1 - i))
1164+
| otherwise -> Collision h (A.delete v i)
11691165
Nothing -> t
11701166
| otherwise = t
11711167
{-# INLINABLE delete' #-}
@@ -1186,10 +1182,9 @@ deleteKeyExists !collPos0 !h0 !k0 !m0 = go collPos0 h0 k0 m0
11861182
in case st' of
11871183
Empty | A.length ary == 1 -> Empty
11881184
| A.length ary == 2 ->
1189-
case (i, A.index ary 0, A.index ary 1) of
1190-
(0, _, l) | isLeafOrCollision l -> l
1191-
(1, l, _) | isLeafOrCollision l -> l
1192-
_ -> bIndexed
1185+
case A.index ary (1 - i) of
1186+
l | isLeafOrCollision l -> l
1187+
_ -> bIndexed
11931188
| otherwise -> bIndexed
11941189
where
11951190
bIndexed = BitmapIndexed (b .&. complement m) (A.delete ary i)
@@ -1208,11 +1203,8 @@ deleteKeyExists !collPos0 !h0 !k0 !m0 = go collPos0 h0 k0 m0
12081203
_ -> Full (A.update ary i st')
12091204
where i = index' shiftedHash
12101205
go collPos _shiftedHash _k (Collision h v)
1211-
| A.length v == 2
1212-
= if collPos == 0
1213-
then Leaf h (A.index v 1)
1214-
else Leaf h (A.index v 0)
1215-
| otherwise = Collision h (A.delete v collPos)
1206+
| A.length v == 2 = Leaf h (A.index v (1 - collPos))
1207+
| otherwise = Collision h (A.delete v collPos)
12161208
go !_ !_ !_ Empty = Empty -- error "Internal error: deleteKeyExists empty"
12171209

12181210
-- Customized version of 'index' that doesn't require a 'Shift'.

0 commit comments

Comments
 (0)