@@ -4205,7 +4205,14 @@ ratio = 2
42054205-- It is only written in such a way that every node is pattern-matched only once.
42064206
42074207balance :: k -> a -> Map k a -> Map k a -> Map k a
4208- balance k x l r = case l of
4208+ balance k x l r = case (l, r) of
4209+ (Bin ls _ _ _ _, Bin rs _ _ _ _)
4210+ | rs <= delta* ls && ls <= delta* rs -> Bin (1 + ls+ rs) k x l r
4211+ _ -> balance_ k x l r
4212+ {-# INLINE balance #-} -- See Note [Inlining balance] in Data.Set.Internal
4213+
4214+ balance_ :: k -> a -> Map k a -> Map k a -> Map k a
4215+ balance_ k x l r = case l of
42094216 Tip -> case r of
42104217 Tip -> Bin 1 k x Tip Tip
42114218 (Bin _ _ _ Tip Tip ) -> Bin 2 k x Tip r
@@ -4229,13 +4236,12 @@ balance k x l r = case l of
42294236 | rls < ratio* rrs -> Bin (1 + ls+ rs) rk rx (Bin (1 + ls+ rls) k x l rl) rr
42304237 | 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)
42314238 (_, _) -> error " Failure in Data.Map.balance"
4232- | ls > delta* rs -> case (ll, lr) of
4239+ | {- ls > delta*rs -} otherwise -> case (ll, lr) of
42334240 (Bin lls _ _ _ _, Bin lrs lrk lrx lrl lrr)
42344241 | lrs < ratio* lls -> Bin (1 + ls+ rs) lk lx ll (Bin (1 + rs+ lrs) k x lr r)
42354242 | 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)
42364243 (_, _) -> error " Failure in Data.Map.balance"
4237- | otherwise -> Bin (1 + ls+ rs) k x l r
4238- {-# NOINLINE balance #-}
4244+ {-# NOINLINE balance_ #-}
42394245
42404246-- Functions balanceL and balanceR are specialised versions of balance.
42414247-- balanceL only checks whether the left subtree is too big,
@@ -4244,7 +4250,14 @@ balance k x l r = case l of
42444250-- balanceL is called when left subtree might have been inserted to or when
42454251-- right subtree might have been deleted from.
42464252balanceL :: k -> a -> Map k a -> Map k a -> Map k a
4247- balanceL k x l r = case r of
4253+ balanceL k x l r = case (l, r) of
4254+ (Bin ls _ _ _ _, Bin rs _ _ _ _)
4255+ | ls <= delta* rs -> Bin (1 + ls+ rs) k x l r
4256+ _ -> balanceL_ k x l r
4257+ {-# INLINE balanceL #-} -- See Note [Inlining balance] in Data.Set.Internal
4258+
4259+ balanceL_ :: k -> a -> Map k a -> Map k a -> Map k a
4260+ balanceL_ k x l r = case r of
42484261 Tip -> case l of
42494262 Tip -> Bin 1 k x Tip Tip
42504263 (Bin _ _ _ Tip Tip ) -> Bin 2 k x l Tip
@@ -4257,19 +4270,24 @@ balanceL k x l r = case r of
42574270 (Bin rs _ _ _ _) -> case l of
42584271 Tip -> Bin (1 + rs) k x Tip r
42594272
4260- (Bin ls lk lx ll lr)
4261- | ls > delta* rs -> case (ll, lr) of
4273+ (Bin ls lk lx ll lr) -> case (ll, lr) of
42624274 (Bin lls _ _ _ _, Bin lrs lrk lrx lrl lrr)
42634275 | lrs < ratio* lls -> Bin (1 + ls+ rs) lk lx ll (Bin (1 + rs+ lrs) k x lr r)
42644276 | 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)
4265- (_, _) -> error " Failure in Data.Map.balanceL"
4266- | otherwise -> Bin (1 + ls+ rs) k x l r
4267- {-# NOINLINE balanceL #-}
4277+ (_, _) -> error " Failure in Data.Map.balanceL_"
4278+ {-# NOINLINE balanceL_ #-}
42684279
42694280-- balanceR is called when right subtree might have been inserted to or when
42704281-- left subtree might have been deleted from.
42714282balanceR :: k -> a -> Map k a -> Map k a -> Map k a
4272- balanceR k x l r = case l of
4283+ balanceR k x l r = case (l, r) of
4284+ (Bin ls _ _ _ _, Bin rs _ _ _ _)
4285+ | rs <= delta* ls -> Bin (1 + ls+ rs) k x l r
4286+ _ -> balanceR_ k x l r
4287+ {-# INLINE balanceR #-} -- See Note [Inlining balance] in Data.Set.Internal
4288+
4289+ balanceR_ :: k -> a -> Map k a -> Map k a -> Map k a
4290+ balanceR_ k x l r = case l of
42734291 Tip -> case r of
42744292 Tip -> Bin 1 k x Tip Tip
42754293 (Bin _ _ _ Tip Tip ) -> Bin 2 k x Tip r
@@ -4282,14 +4300,12 @@ balanceR k x l r = case l of
42824300 (Bin ls _ _ _ _) -> case r of
42834301 Tip -> Bin (1 + ls) k x l Tip
42844302
4285- (Bin rs rk rx rl rr)
4286- | rs > delta* ls -> case (rl, rr) of
4303+ (Bin rs rk rx rl rr) -> case (rl, rr) of
42874304 (Bin rls rlk rlx rll rlr, Bin rrs _ _ _ _)
42884305 | rls < ratio* rrs -> Bin (1 + ls+ rs) rk rx (Bin (1 + ls+ rls) k x l rl) rr
42894306 | 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)
4290- (_, _) -> error " Failure in Data.Map.balanceR"
4291- | otherwise -> Bin (1 + ls+ rs) k x l r
4292- {-# NOINLINE balanceR #-}
4307+ (_, _) -> error " Failure in Data.Map.balanceR_"
4308+ {-# NOINLINE balanceR_ #-}
42934309
42944310
42954311{- -------------------------------------------------------------------
0 commit comments