Skip to content
This repository was archived by the owner on Oct 4, 2020. It is now read-only.

Commit e363edb

Browse files
committed
Revert "Better pattern sharing for perf."
This reverts commit ebf42f7.
1 parent 59433d6 commit e363edb

File tree

1 file changed

+62
-94
lines changed

1 file changed

+62
-94
lines changed

src/Data/Map.purs

Lines changed: 62 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -116,24 +116,14 @@ checkValid tree = length (nub (allHeights tree)) == one
116116
-- | Lookup a value for the specified key
117117
lookup :: forall k v. (Ord k) => k -> Map k v -> Maybe v
118118
lookup _ Leaf = Nothing
119-
lookup k tree =
120-
let comp :: k -> k -> Ordering
121-
comp = compare
122-
in case tree of
123-
Two left k1 v right ->
124-
case comp k k1 of
125-
EQ -> Just v
126-
LT -> lookup k left
127-
_ -> lookup k right
128-
Three left k1 v1 mid k2 v2 right ->
129-
case comp k k1 of
130-
EQ -> Just v1
131-
c1 ->
132-
case c1, comp k k2 of
133-
_ , EQ -> Just v2
134-
LT, _ -> lookup k left
135-
_ , GT -> lookup k right
136-
_ , _ -> lookup k mid
119+
lookup k (Two _ k1 v _) | k == k1 = Just v
120+
lookup k (Two left k1 _ _) | k < k1 = lookup k left
121+
lookup k (Two _ _ _ right) = lookup k right
122+
lookup k (Three _ k1 v1 _ _ _ _) | k == k1 = Just v1
123+
lookup k (Three _ _ _ _ k2 v2 _) | k == k2 = Just v2
124+
lookup k (Three left k1 _ _ _ _ _) | k < k1 = lookup k left
125+
lookup k (Three _ k1 _ mid k2 _ _) | k1 < k && k <= k2 = lookup k mid
126+
lookup k (Three _ _ _ _ _ _ right) = lookup k right
137127

138128
-- | Test if a key is a member of a map
139129
member :: forall k v. (Ord k) => k -> Map k v -> Boolean
@@ -148,104 +138,82 @@ data TreeContext k v
148138

149139
fromZipper :: forall k v. (Ord k) => List (TreeContext k v) -> Map k v -> Map k v
150140
fromZipper Nil tree = tree
151-
fromZipper (Cons x ctx) tree =
152-
case x of
153-
TwoLeft k1 v1 right -> fromZipper ctx (Two tree k1 v1 right)
154-
TwoRight left k1 v1 -> fromZipper ctx (Two left k1 v1 tree)
155-
ThreeLeft k1 v1 mid k2 v2 right -> fromZipper ctx (Three tree k1 v1 mid k2 v2 right)
156-
ThreeMiddle left k1 v1 k2 v2 right -> fromZipper ctx (Three left k1 v1 tree k2 v2 right)
157-
ThreeRight left k1 v1 mid k2 v2 -> fromZipper ctx (Three left k1 v1 mid k2 v2 tree)
141+
fromZipper (Cons (TwoLeft k1 v1 right) ctx) left = fromZipper ctx (Two left k1 v1 right)
142+
fromZipper (Cons (TwoRight left k1 v1) ctx) right = fromZipper ctx (Two left k1 v1 right)
143+
fromZipper (Cons (ThreeLeft k1 v1 mid k2 v2 right) ctx) left = fromZipper ctx (Three left k1 v1 mid k2 v2 right)
144+
fromZipper (Cons (ThreeMiddle left k1 v1 k2 v2 right) ctx) mid = fromZipper ctx (Three left k1 v1 mid k2 v2 right)
145+
fromZipper (Cons (ThreeRight left k1 v1 mid k2 v2) ctx) right = fromZipper ctx (Three left k1 v1 mid k2 v2 right)
158146

159147
data KickUp k v = KickUp (Map k v) k v (Map k v)
160148

161149
-- | Insert a key/value pair into a map
162150
insert :: forall k v. (Ord k) => k -> v -> Map k v -> Map k v
163151
insert = down Nil
164152
where
165-
comp :: k -> k -> Ordering
166-
comp = compare
167-
168153
down :: List (TreeContext k v) -> k -> v -> Map k v -> Map k v
169154
down ctx k v Leaf = up ctx (KickUp Leaf k v Leaf)
170-
down ctx k v (Two left k1 v1 right) =
171-
case comp k k1 of
172-
EQ -> fromZipper ctx (Two left k v right)
173-
LT -> down (Cons (TwoLeft k1 v1 right) ctx) k v left
174-
_ -> down (Cons (TwoRight left k1 v1) ctx) k v right
175-
down ctx k v (Three left k1 v1 mid k2 v2 right) =
176-
case comp k k1 of
177-
EQ -> fromZipper ctx (Three left k v mid k2 v2 right)
178-
c1 ->
179-
case c1, comp k k2 of
180-
_ , EQ -> fromZipper ctx (Three left k1 v1 mid k v right)
181-
LT, _ -> down (Cons (ThreeLeft k1 v1 mid k2 v2 right) ctx) k v left
182-
GT, LT -> down (Cons (ThreeMiddle left k1 v1 k2 v2 right) ctx) k v mid
183-
_ , _ -> down (Cons (ThreeRight left k1 v1 mid k2 v2) ctx) k v right
155+
down ctx k v (Two left k1 _ right) | k == k1 = fromZipper ctx (Two left k v right)
156+
down ctx k v (Two left k1 v1 right) | k < k1 = down (Cons (TwoLeft k1 v1 right) ctx) k v left
157+
down ctx k v (Two left k1 v1 right) = down (Cons (TwoRight left k1 v1) ctx) k v right
158+
down ctx k v (Three left k1 _ mid k2 v2 right) | k == k1 = fromZipper ctx (Three left k v mid k2 v2 right)
159+
down ctx k v (Three left k1 v1 mid k2 _ right) | k == k2 = fromZipper ctx (Three left k1 v1 mid k v right)
160+
down ctx k v (Three left k1 v1 mid k2 v2 right) | k < k1 = down (Cons (ThreeLeft k1 v1 mid k2 v2 right) ctx) k v left
161+
down ctx k v (Three left k1 v1 mid k2 v2 right) | k1 < k && k <= k2 = down (Cons (ThreeMiddle left k1 v1 k2 v2 right) ctx) k v mid
162+
down ctx k v (Three left k1 v1 mid k2 v2 right) = down (Cons (ThreeRight left k1 v1 mid k2 v2) ctx) k v right
184163

185164
up :: List (TreeContext k v) -> KickUp k v -> Map k v
186165
up Nil (KickUp left k v right) = Two left k v right
187-
up (Cons x ctx) kup =
188-
case x, kup of
189-
TwoLeft k1 v1 right, KickUp left k v mid -> fromZipper ctx (Three left k v mid k1 v1 right)
190-
TwoRight left k1 v1, KickUp mid k v right -> fromZipper ctx (Three left k1 v1 mid k v right)
191-
ThreeLeft k1 v1 c k2 v2 d, KickUp a k v b -> up ctx (KickUp (Two a k v b) k1 v1 (Two c k2 v2 d))
192-
ThreeMiddle a k1 v1 k2 v2 d, KickUp b k v c -> up ctx (KickUp (Two a k1 v1 b) k v (Two c k2 v2 d))
193-
ThreeRight a k1 v1 b k2 v2, KickUp c k v d -> up ctx (KickUp (Two a k1 v1 b) k2 v2 (Two c k v d))
166+
up (Cons (TwoLeft k1 v1 right) ctx) (KickUp left k v mid) = fromZipper ctx (Three left k v mid k1 v1 right)
167+
up (Cons (TwoRight left k1 v1) ctx) (KickUp mid k v right) = fromZipper ctx (Three left k1 v1 mid k v right)
168+
up (Cons (ThreeLeft k1 v1 c k2 v2 d) ctx) (KickUp a k v b) = up ctx (KickUp (Two a k v b) k1 v1 (Two c k2 v2 d))
169+
up (Cons (ThreeMiddle a k1 v1 k2 v2 d) ctx) (KickUp b k v c) = up ctx (KickUp (Two a k1 v1 b) k v (Two c k2 v2 d))
170+
up (Cons (ThreeRight a k1 v1 b k2 v2) ctx) (KickUp c k v d) = up ctx (KickUp (Two a k1 v1 b) k2 v2 (Two c k v d))
194171

195172
-- | Delete a key and its corresponding value from a map
196173
delete :: forall k v. (Ord k) => k -> Map k v -> Map k v
197174
delete = down Nil
198175
where
199-
comp :: k -> k -> Ordering
200-
comp = compare
201-
202176
down :: List (TreeContext k v) -> k -> Map k v -> Map k v
203177
down ctx _ Leaf = fromZipper ctx Leaf
204-
down ctx k (Two left k1 v1 right) =
205-
case right, comp k k1 of
206-
Leaf, EQ -> up ctx Leaf
207-
_ , EQ -> let max = maxNode left
208-
in removeMaxNode (Cons (TwoLeft max.key max.value right) ctx) left
209-
_ , LT -> down (Cons (TwoLeft k1 v1 right) ctx) k left
210-
_ , _ -> down (Cons (TwoRight left k1 v1) ctx) k right
211-
down ctx k (Three left k1 v1 mid k2 v2 right) =
212-
let leaves =
213-
case left, mid, right of
214-
Leaf, Leaf, Leaf -> true
215-
_ , _ , _ -> false
216-
in case leaves, comp k k1, comp k k2 of
217-
true, EQ, _ -> fromZipper ctx (Two Leaf k2 v2 Leaf)
218-
true, _ , EQ -> fromZipper ctx (Two Leaf k1 v1 Leaf)
219-
_ , EQ, _ -> let max = maxNode left
220-
in removeMaxNode (Cons (ThreeLeft max.key max.value mid k2 v2 right) ctx) left
221-
_ , _ , EQ -> let max = maxNode mid
222-
in removeMaxNode (Cons (ThreeMiddle left k1 v1 max.key max.value right) ctx) mid
223-
_ , LT, _ -> down (Cons (ThreeLeft k1 v1 mid k2 v2 right) ctx) k left
224-
_ , GT, LT -> down (Cons (ThreeMiddle left k1 v1 k2 v2 right) ctx) k mid
225-
_ , _ , _ -> down (Cons (ThreeRight left k1 v1 mid k2 v2) ctx) k right
178+
down ctx k (Two Leaf k1 _ Leaf)
179+
| k == k1 = up ctx Leaf
180+
down ctx k (Two left k1 v1 right)
181+
| k == k1 = let max = maxNode left
182+
in removeMaxNode (Cons (TwoLeft max.key max.value right) ctx) left
183+
| k < k1 = down (Cons (TwoLeft k1 v1 right) ctx) k left
184+
| otherwise = down (Cons (TwoRight left k1 v1) ctx) k right
185+
down ctx k (Three Leaf k1 v1 Leaf k2 v2 Leaf)
186+
| k == k1 = fromZipper ctx (Two Leaf k2 v2 Leaf)
187+
| k == k2 = fromZipper ctx (Two Leaf k1 v1 Leaf)
188+
down ctx k (Three left k1 v1 mid k2 v2 right)
189+
| k == k1 = let max = maxNode left
190+
in removeMaxNode (Cons (ThreeLeft max.key max.value mid k2 v2 right) ctx) left
191+
| k == k2 = let max = maxNode mid
192+
in removeMaxNode (Cons (ThreeMiddle left k1 v1 max.key max.value right) ctx) mid
193+
| k < k1 = down (Cons (ThreeLeft k1 v1 mid k2 v2 right) ctx) k left
194+
| k1 < k && k < k2 = down (Cons (ThreeMiddle left k1 v1 k2 v2 right) ctx) k mid
195+
| otherwise = down (Cons (ThreeRight left k1 v1 mid k2 v2) ctx) k right
226196

227197
up :: List (TreeContext k v) -> Map k v -> Map k v
228198
up Nil tree = tree
229-
up (Cons x ctx) tree =
230-
case x, tree of
231-
TwoLeft k1 v1 Leaf, Leaf -> fromZipper ctx (Two Leaf k1 v1 Leaf)
232-
TwoRight Leaf k1 v1, Leaf -> fromZipper ctx (Two Leaf k1 v1 Leaf)
233-
TwoLeft k1 v1 (Two m k2 v2 r), l -> up ctx (Three l k1 v1 m k2 v2 r)
234-
TwoRight (Two l k1 v1 m) k2 v2, r -> up ctx (Three l k1 v1 m k2 v2 r)
235-
TwoLeft k1 v1 (Three b k2 v2 c k3 v3 d), a -> fromZipper ctx (Two (Two a k1 v1 b) k2 v2 (Two c k3 v3 d))
236-
TwoRight (Three a k1 v1 b k2 v2 c) k3 v3, d -> fromZipper ctx (Two (Two a k1 v1 b) k2 v2 (Two c k3 v3 d))
237-
ThreeLeft k1 v1 Leaf k2 v2 Leaf, Leaf -> fromZipper ctx (Three Leaf k1 v1 Leaf k2 v2 Leaf)
238-
ThreeMiddle Leaf k1 v1 k2 v2 Leaf, Leaf -> fromZipper ctx (Three Leaf k1 v1 Leaf k2 v2 Leaf)
239-
ThreeRight Leaf k1 v1 Leaf k2 v2, Leaf -> fromZipper ctx (Three Leaf k1 v1 Leaf k2 v2 Leaf)
240-
ThreeLeft k1 v1 (Two b k2 v2 c) k3 v3 d, a -> fromZipper ctx (Two (Three a k1 v1 b k2 v2 c) k3 v3 d)
241-
ThreeMiddle (Two a k1 v1 b) k2 v2 k3 v3 d, c -> fromZipper ctx (Two (Three a k1 v1 b k2 v2 c) k3 v3 d)
242-
ThreeMiddle a k1 v1 k2 v2 (Two c k3 v3 d), b -> fromZipper ctx (Two a k1 v1 (Three b k2 v2 c k3 v3 d))
243-
ThreeRight a k1 v1 (Two b k2 v2 c) k3 v3, d -> fromZipper ctx (Two a k1 v1 (Three b k2 v2 c k3 v3 d))
244-
ThreeLeft k1 v1 (Three b k2 v2 c k3 v3 d) k4 v4 e, a -> fromZipper ctx (Three (Two a k1 v1 b) k2 v2 (Two c k3 v3 d) k4 v4 e)
245-
ThreeMiddle (Three a k1 v1 b k2 v2 c) k3 v3 k4 v4 e, d -> fromZipper ctx (Three (Two a k1 v1 b) k2 v2 (Two c k3 v3 d) k4 v4 e)
246-
ThreeMiddle a k1 v1 k2 v2 (Three c k3 v3 d k4 v4 e), b -> fromZipper ctx (Three a k1 v1 (Two b k2 v2 c) k3 v3 (Two d k4 v4 e))
247-
ThreeRight a k1 v1 (Three b k2 v2 c k3 v3 d) k4 v4, e -> fromZipper ctx (Three a k1 v1 (Two b k2 v2 c) k3 v3 (Two d k4 v4 e))
248-
_, _ -> unsafeThrow "Impossible case in 'up'"
199+
up (Cons (TwoLeft k1 v1 Leaf) ctx) Leaf = fromZipper ctx (Two Leaf k1 v1 Leaf)
200+
up (Cons (TwoRight Leaf k1 v1) ctx) Leaf = fromZipper ctx (Two Leaf k1 v1 Leaf)
201+
up (Cons (TwoLeft k1 v1 (Two m k2 v2 r)) ctx) l = up ctx (Three l k1 v1 m k2 v2 r)
202+
up (Cons (TwoRight (Two l k1 v1 m) k2 v2) ctx) r = up ctx (Three l k1 v1 m k2 v2 r)
203+
up (Cons (TwoLeft k1 v1 (Three b k2 v2 c k3 v3 d)) ctx) a = fromZipper ctx (Two (Two a k1 v1 b) k2 v2 (Two c k3 v3 d))
204+
up (Cons (TwoRight (Three a k1 v1 b k2 v2 c) k3 v3) ctx) d = fromZipper ctx (Two (Two a k1 v1 b) k2 v2 (Two c k3 v3 d))
205+
up (Cons (ThreeLeft k1 v1 Leaf k2 v2 Leaf) ctx) Leaf = fromZipper ctx (Three Leaf k1 v1 Leaf k2 v2 Leaf)
206+
up (Cons (ThreeMiddle Leaf k1 v1 k2 v2 Leaf) ctx) Leaf = fromZipper ctx (Three Leaf k1 v1 Leaf k2 v2 Leaf)
207+
up (Cons (ThreeRight Leaf k1 v1 Leaf k2 v2) ctx) Leaf = fromZipper ctx (Three Leaf k1 v1 Leaf k2 v2 Leaf)
208+
up (Cons (ThreeLeft k1 v1 (Two b k2 v2 c) k3 v3 d) ctx) a = fromZipper ctx (Two (Three a k1 v1 b k2 v2 c) k3 v3 d)
209+
up (Cons (ThreeMiddle (Two a k1 v1 b) k2 v2 k3 v3 d) ctx) c = fromZipper ctx (Two (Three a k1 v1 b k2 v2 c) k3 v3 d)
210+
up (Cons (ThreeMiddle a k1 v1 k2 v2 (Two c k3 v3 d)) ctx) b = fromZipper ctx (Two a k1 v1 (Three b k2 v2 c k3 v3 d))
211+
up (Cons (ThreeRight a k1 v1 (Two b k2 v2 c) k3 v3) ctx) d = fromZipper ctx (Two a k1 v1 (Three b k2 v2 c k3 v3 d))
212+
up (Cons (ThreeLeft k1 v1 (Three b k2 v2 c k3 v3 d) k4 v4 e) ctx) a = fromZipper ctx (Three (Two a k1 v1 b) k2 v2 (Two c k3 v3 d) k4 v4 e)
213+
up (Cons (ThreeMiddle (Three a k1 v1 b k2 v2 c) k3 v3 k4 v4 e) ctx) d = fromZipper ctx (Three (Two a k1 v1 b) k2 v2 (Two c k3 v3 d) k4 v4 e)
214+
up (Cons (ThreeMiddle a k1 v1 k2 v2 (Three c k3 v3 d k4 v4 e)) ctx) b = fromZipper ctx (Three a k1 v1 (Two b k2 v2 c) k3 v3 (Two d k4 v4 e))
215+
up (Cons (ThreeRight a k1 v1 (Three b k2 v2 c k3 v3 d) k4 v4) ctx) e = fromZipper ctx (Three a k1 v1 (Two b k2 v2 c) k3 v3 (Two d k4 v4 e))
216+
up _ _ = unsafeThrow "Impossible case in 'up'"
249217

250218
maxNode :: Map k v -> { key :: k, value :: v }
251219
maxNode (Two _ k v Leaf) = { key: k, value: v }

0 commit comments

Comments
 (0)