@@ -4190,7 +4190,14 @@ ratio = 2
41904190-- It is only written in such a way that every node is pattern-matched only once.
41914191
41924192balance :: k -> a -> Map k a -> Map k a -> Map k a
4193- balance k x l r = case l of
4193+ balance k x l r = case (l, r) of
4194+ (Bin ls _ _ _ _, Bin rs _ _ _ _)
4195+ | rs <= delta* ls && ls <= delta* rs -> Bin (1 + ls+ rs) k x l r
4196+ _ -> balance_ k x l r
4197+ {-# INLINE balance #-} -- See Note [Inlining balance] in Data.Set.Internal
4198+
4199+ balance_ :: k -> a -> Map k a -> Map k a -> Map k a
4200+ balance_ k x l r = case l of
41944201 Tip -> case r of
41954202 Tip -> Bin 1 k x Tip Tip
41964203 (Bin _ _ _ Tip Tip ) -> Bin 2 k x Tip r
@@ -4214,13 +4221,12 @@ balance k x l r = case l of
42144221 | rls < ratio* rrs -> Bin (1 + ls+ rs) rk rx (Bin (1 + ls+ rls) k x l rl) rr
42154222 | otherwise -> Bin (1 + ls+ rs) rlk rlx (Bin (1 + ls+ size rll) k x l rll) (Bin (1 + rrs+ size rlr) rk rx rlr rr)
42164223 (_, _) -> error " Failure in Data.Map.balance"
4217- | ls > delta* rs -> case (ll, lr) of
4224+ | {- ls > delta*rs -} otherwise -> case (ll, lr) of
42184225 (Bin lls _ _ _ _, Bin lrs lrk lrx lrl lrr)
42194226 | lrs < ratio* lls -> Bin (1 + ls+ rs) lk lx ll (Bin (1 + rs+ lrs) k x lr r)
42204227 | otherwise -> Bin (1 + ls+ rs) lrk lrx (Bin (1 + lls+ size lrl) lk lx ll lrl) (Bin (1 + rs+ size lrr) k x lrr r)
42214228 (_, _) -> error " Failure in Data.Map.balance"
4222- | otherwise -> Bin (1 + ls+ rs) k x l r
4223- {-# NOINLINE balance #-}
4229+ {-# NOINLINE balance_ #-}
42244230
42254231-- Functions balanceL and balanceR are specialised versions of balance.
42264232-- balanceL only checks whether the left subtree is too big,
@@ -4229,7 +4235,14 @@ balance k x l r = case l of
42294235-- balanceL is called when left subtree might have been inserted to or when
42304236-- right subtree might have been deleted from.
42314237balanceL :: k -> a -> Map k a -> Map k a -> Map k a
4232- balanceL k x l r = case r of
4238+ balanceL k x l r = case (l, r) of
4239+ (Bin ls _ _ _ _, Bin rs _ _ _ _)
4240+ | ls <= delta* rs -> Bin (1 + ls+ rs) k x l r
4241+ _ -> balanceL_ k x l r
4242+ {-# INLINE balanceL #-} -- See Note [Inlining balance] in Data.Set.Internal
4243+
4244+ balanceL_ :: k -> a -> Map k a -> Map k a -> Map k a
4245+ balanceL_ k x l r = case r of
42334246 Tip -> case l of
42344247 Tip -> Bin 1 k x Tip Tip
42354248 (Bin _ _ _ Tip Tip ) -> Bin 2 k x l Tip
@@ -4242,19 +4255,24 @@ balanceL k x l r = case r of
42424255 (Bin rs _ _ _ _) -> case l of
42434256 Tip -> Bin (1 + rs) k x Tip r
42444257
4245- (Bin ls lk lx ll lr)
4246- | ls > delta* rs -> case (ll, lr) of
4258+ (Bin ls lk lx ll lr) -> case (ll, lr) of
42474259 (Bin lls _ _ _ _, Bin lrs lrk lrx lrl lrr)
42484260 | lrs < ratio* lls -> Bin (1 + ls+ rs) lk lx ll (Bin (1 + rs+ lrs) k x lr r)
42494261 | otherwise -> Bin (1 + ls+ rs) lrk lrx (Bin (1 + lls+ size lrl) lk lx ll lrl) (Bin (1 + rs+ size lrr) k x lrr r)
4250- (_, _) -> error " Failure in Data.Map.balanceL"
4251- | otherwise -> Bin (1 + ls+ rs) k x l r
4252- {-# NOINLINE balanceL #-}
4262+ (_, _) -> error " Failure in Data.Map.balanceL_"
4263+ {-# NOINLINE balanceL_ #-}
42534264
42544265-- balanceR is called when right subtree might have been inserted to or when
42554266-- left subtree might have been deleted from.
42564267balanceR :: k -> a -> Map k a -> Map k a -> Map k a
4257- balanceR k x l r = case l of
4268+ balanceR k x l r = case (l, r) of
4269+ (Bin ls _ _ _ _, Bin rs _ _ _ _)
4270+ | rs <= delta* ls -> Bin (1 + ls+ rs) k x l r
4271+ _ -> balanceR_ k x l r
4272+ {-# INLINE balanceR #-} -- See Note [Inlining balance] in Data.Set.Internal
4273+
4274+ balanceR_ :: k -> a -> Map k a -> Map k a -> Map k a
4275+ balanceR_ k x l r = case l of
42584276 Tip -> case r of
42594277 Tip -> Bin 1 k x Tip Tip
42604278 (Bin _ _ _ Tip Tip ) -> Bin 2 k x Tip r
@@ -4267,14 +4285,12 @@ balanceR k x l r = case l of
42674285 (Bin ls _ _ _ _) -> case r of
42684286 Tip -> Bin (1 + ls) k x l Tip
42694287
4270- (Bin rs rk rx rl rr)
4271- | rs > delta* ls -> case (rl, rr) of
4288+ (Bin rs rk rx rl rr) -> case (rl, rr) of
42724289 (Bin rls rlk rlx rll rlr, Bin rrs _ _ _ _)
42734290 | rls < ratio* rrs -> Bin (1 + ls+ rs) rk rx (Bin (1 + ls+ rls) k x l rl) rr
42744291 | otherwise -> Bin (1 + ls+ rs) rlk rlx (Bin (1 + ls+ size rll) k x l rll) (Bin (1 + rrs+ size rlr) rk rx rlr rr)
4275- (_, _) -> error " Failure in Data.Map.balanceR"
4276- | otherwise -> Bin (1 + ls+ rs) k x l r
4277- {-# NOINLINE balanceR #-}
4292+ (_, _) -> error " Failure in Data.Map.balanceR_"
4293+ {-# NOINLINE balanceR_ #-}
42784294
42794295
42804296{- -------------------------------------------------------------------
0 commit comments