@@ -1558,7 +1558,7 @@ take i0 m0 = go i0 m0
1558
1558
go i (Bin _ kx x l r) =
1559
1559
case compare i sizeL of
1560
1560
LT -> go i l
1561
- GT -> link kx x l (go (i - sizeL - 1 ) r)
1561
+ GT -> linkL kx x l (go (i - sizeL - 1 ) r)
1562
1562
EQ -> l
1563
1563
where sizeL = size l
1564
1564
@@ -1578,7 +1578,7 @@ drop i0 m0 = go i0 m0
1578
1578
go ! _ Tip = Tip
1579
1579
go i (Bin _ kx x l r) =
1580
1580
case compare i sizeL of
1581
- LT -> link kx x (go i l) r
1581
+ LT -> linkR kx x (go i l) r
1582
1582
GT -> go (i - sizeL - 1 ) r
1583
1583
EQ -> insertMin kx x r
1584
1584
where sizeL = size l
@@ -1600,9 +1600,9 @@ splitAt i0 m0
1600
1600
go i (Bin _ kx x l r)
1601
1601
= case compare i sizeL of
1602
1602
LT -> case go i l of
1603
- ll :*: lr -> ll :*: link kx x lr r
1603
+ ll :*: lr -> ll :*: linkR kx x lr r
1604
1604
GT -> case go (i - sizeL - 1 ) r of
1605
- rl :*: rr -> link kx x l rl :*: rr
1605
+ rl :*: rr -> linkL kx x l rl :*: rr
1606
1606
EQ -> l :*: insertMin kx x r
1607
1607
where sizeL = size l
1608
1608
@@ -3034,7 +3034,7 @@ filterWithKeyA p t@(Bin _ kx x l r) =
3034
3034
takeWhileAntitone :: (k -> Bool ) -> Map k a -> Map k a
3035
3035
takeWhileAntitone _ Tip = Tip
3036
3036
takeWhileAntitone p (Bin _ kx x l r)
3037
- | p kx = link kx x l (takeWhileAntitone p r)
3037
+ | p kx = linkL kx x l (takeWhileAntitone p r)
3038
3038
| otherwise = takeWhileAntitone p l
3039
3039
3040
3040
-- | \(O(\log n)\). Drop while a predicate on the keys holds.
@@ -3052,7 +3052,7 @@ dropWhileAntitone :: (k -> Bool) -> Map k a -> Map k a
3052
3052
dropWhileAntitone _ Tip = Tip
3053
3053
dropWhileAntitone p (Bin _ kx x l r)
3054
3054
| p kx = dropWhileAntitone p r
3055
- | otherwise = link kx x (dropWhileAntitone p l) r
3055
+ | otherwise = linkR kx x (dropWhileAntitone p l) r
3056
3056
3057
3057
-- | \(O(\log n)\). Divide a map at the point where a predicate on the keys stops holding.
3058
3058
-- The user is responsible for ensuring that for all keys @j@ and @k@ in the map,
@@ -3075,8 +3075,8 @@ spanAntitone p0 m = toPair (go p0 m)
3075
3075
where
3076
3076
go _ Tip = Tip :*: Tip
3077
3077
go p (Bin _ kx x l r)
3078
- | p kx = let u :*: v = go p r in link kx x l u :*: v
3079
- | otherwise = let u :*: v = go p l in u :*: link kx x v r
3078
+ | p kx = let u :*: v = go p r in linkL kx x l u :*: v
3079
+ | otherwise = let u :*: v = go p l in u :*: linkR kx x v r
3080
3080
3081
3081
-- | \(O(n)\). Partition the map according to a predicate. The first
3082
3082
-- map contains all elements that satisfy the predicate, the second all
@@ -3842,7 +3842,7 @@ ascLinkTop (Push kx x l@(Bin lsz _ _ _ _) stk) !rsz r ky y
3842
3842
ascLinkTop stk ! _ l kx x = Push kx x l stk
3843
3843
3844
3844
ascLinkAll :: Stack k a -> Map k a
3845
- ascLinkAll stk = foldl'Stack (\ r kx x l -> link kx x l r) Tip stk
3845
+ ascLinkAll stk = foldl'Stack (\ r kx x l -> linkL kx x l r) Tip stk
3846
3846
{-# INLINABLE ascLinkAll #-}
3847
3847
3848
3848
-- | \(O(n)\). Build a map from a descending list of distinct elements in linear time.
@@ -3875,7 +3875,7 @@ descLinkTop ky y !_ r stk = Push ky y r stk
3875
3875
{-# INLINABLE descLinkTop #-}
3876
3876
3877
3877
descLinkAll :: Stack k a -> Map k a
3878
- descLinkAll stk = foldl'Stack (\ l kx x r -> link kx x l r) Tip stk
3878
+ descLinkAll stk = foldl'Stack (\ l kx x r -> linkR kx x l r) Tip stk
3879
3879
{-# INLINABLE descLinkAll #-}
3880
3880
3881
3881
data Stack k a = Push ! k a ! (Map k a ) ! (Stack k a ) | Nada
@@ -3939,8 +3939,8 @@ split !k0 t0 = toPair $ go k0 t0
3939
3939
case t of
3940
3940
Tip -> Tip :*: Tip
3941
3941
Bin _ kx x l r -> case compare k kx of
3942
- LT -> let (lt :*: gt) = go k l in lt :*: link kx x gt r
3943
- GT -> let (lt :*: gt) = go k r in link kx x l lt :*: gt
3942
+ LT -> let (lt :*: gt) = go k l in lt :*: linkR kx x gt r
3943
+ GT -> let (lt :*: gt) = go k r in linkL kx x l lt :*: gt
3944
3944
EQ -> (l :*: r)
3945
3945
#if __GLASGOW_HASKELL__
3946
3946
{-# INLINABLE split #-}
@@ -3964,10 +3964,10 @@ splitLookup k0 m = case go k0 m of
3964
3964
Tip -> StrictTriple Tip Nothing Tip
3965
3965
Bin _ kx x l r -> case compare k kx of
3966
3966
LT -> let StrictTriple lt z gt = go k l
3967
- ! gt' = link kx x gt r
3967
+ ! gt' = linkR kx x gt r
3968
3968
in StrictTriple lt z gt'
3969
3969
GT -> let StrictTriple lt z gt = go k r
3970
- ! lt' = link kx x l lt
3970
+ ! lt' = linkL kx x l lt
3971
3971
in StrictTriple lt' z gt
3972
3972
EQ -> StrictTriple l (Just x) r
3973
3973
#if __GLASGOW_HASKELL__
@@ -3988,10 +3988,10 @@ splitMember k0 m = case go k0 m of
3988
3988
Tip -> StrictTriple Tip False Tip
3989
3989
Bin _ kx x l r -> case compare k kx of
3990
3990
LT -> let StrictTriple lt z gt = go k l
3991
- ! gt' = link kx x gt r
3991
+ ! gt' = linkR kx x gt r
3992
3992
in StrictTriple lt z gt'
3993
3993
GT -> let StrictTriple lt z gt = go k r
3994
- ! lt' = link kx x l lt
3994
+ ! lt' = linkL kx x l lt
3995
3995
in StrictTriple lt' z gt
3996
3996
EQ -> StrictTriple l True r
3997
3997
#if __GLASGOW_HASKELL__
@@ -4079,11 +4079,38 @@ finishB (BMap m) = m
4079
4079
link :: k -> a -> Map k a -> Map k a -> Map k a
4080
4080
link kx x Tip r = insertMin kx x r
4081
4081
link kx x l Tip = insertMax kx x l
4082
- link kx x l@ (Bin sizeL ky y ly ry) r@ (Bin sizeR kz z lz rz)
4083
- | delta* sizeL < sizeR = balanceL kz z (link kx x l lz) rz
4084
- | delta* sizeR < sizeL = balanceR ky y ly (link kx x ry r)
4085
- | otherwise = bin kx x l r
4086
-
4082
+ link kx x l@ (Bin lsz lkx lx ll lr) r@ (Bin rsz rkx rx rl rr)
4083
+ | delta* lsz < rsz = balanceL rkx rx (linkR_ kx x lsz l rl) rr
4084
+ | delta* rsz < lsz = balanceR lkx lx ll (linkL_ kx x lr rsz r)
4085
+ | otherwise = Bin (1 + lsz+ rsz) kx x l r
4086
+
4087
+ -- Variant of link. Restores balance when the left tree may be too large for the
4088
+ -- right tree, but not the other way around.
4089
+ linkL :: k -> a -> Map k a -> Map k a -> Map k a
4090
+ linkL kx x l r = case r of
4091
+ Tip -> insertMax kx x l
4092
+ Bin rsz _ _ _ _ -> linkL_ kx x l rsz r
4093
+
4094
+ linkL_ :: k -> a -> Map k a -> Int -> Map k a -> Map k a
4095
+ linkL_ kx x l ! rsz r = case l of
4096
+ Bin lsz lkx lx ll lr
4097
+ | delta* rsz < lsz -> balanceR lkx lx ll (linkL_ kx x lr rsz r)
4098
+ | otherwise -> Bin (1 + lsz+ rsz) kx x l r
4099
+ Tip -> Bin (1 + rsz) kx x Tip r
4100
+
4101
+ -- Variant of link. Restores balance when the right tree may be too large for
4102
+ -- the left tree, but not the other way around.
4103
+ linkR :: k -> a -> Map k a -> Map k a -> Map k a
4104
+ linkR kx x l r = case l of
4105
+ Tip -> insertMin kx x r
4106
+ Bin lsz _ _ _ _ -> linkR_ kx x lsz l r
4107
+
4108
+ linkR_ :: k -> a -> Int -> Map k a -> Map k a -> Map k a
4109
+ linkR_ kx x ! lsz l r = case r of
4110
+ Bin rsz rkx rx rl rr
4111
+ | delta* lsz < rsz -> balanceL rkx rx (linkR_ kx x lsz l rl) rr
4112
+ | otherwise -> Bin (1 + lsz+ rsz) kx x l r
4113
+ Tip -> Bin (1 + lsz) kx x l Tip
4087
4114
4088
4115
-- insertMin and insertMax don't perform potentially expensive comparisons.
4089
4116
insertMax ,insertMin :: k -> a -> Map k a -> Map k a
@@ -4105,10 +4132,24 @@ insertMin kx x t
4105
4132
link2 :: Map k a -> Map k a -> Map k a
4106
4133
link2 Tip r = r
4107
4134
link2 l Tip = l
4108
- link2 l@ (Bin sizeL kx x lx rx) r@ (Bin sizeR ky y ly ry)
4109
- | delta* sizeL < sizeR = balanceL ky y (link2 l ly) ry
4110
- | delta* sizeR < sizeL = balanceR kx x lx (link2 rx r)
4111
- | otherwise = glue l r
4135
+ link2 l@ (Bin lsz lkx lx ll lr) r@ (Bin rsz rkx rx rl rr)
4136
+ | delta* lsz < rsz = balanceL rkx rx (link2R_ lsz l rl) rr
4137
+ | delta* rsz < lsz = balanceR lkx lx ll (link2L_ lr rsz r)
4138
+ | otherwise = glue l r
4139
+
4140
+ link2L_ :: Map k a -> Int -> Map k a -> Map k a
4141
+ link2L_ l ! rsz r = case l of
4142
+ Bin lsz lkx lx ll lr
4143
+ | delta* rsz < lsz -> balanceR lkx lx ll (link2L_ lr rsz r)
4144
+ | otherwise -> glue l r
4145
+ Tip -> r
4146
+
4147
+ link2R_ :: Int -> Map k a -> Map k a -> Map k a
4148
+ link2R_ ! lsz l r = case r of
4149
+ Bin rsz rkx rx rl rr
4150
+ | delta* lsz < rsz -> balanceL rkx rx (link2R_ lsz l rl) rr
4151
+ | otherwise -> glue l r
4152
+ Tip -> l
4112
4153
4113
4154
{- -------------------------------------------------------------------
4114
4155
[glue l r]: glues two trees together.
0 commit comments