@@ -3079,6 +3079,9 @@ mapMaybe f = mapMaybeWithKey (\_ x -> f x)
3079
3079
3080
3080
mapMaybeWithKey :: (k -> a -> Maybe b ) -> Map k a -> Map k b
3081
3081
mapMaybeWithKey _ Tip = Tip
3082
+ mapMaybeWithKey f (Bin 1 kx x _ _) = case f kx x of
3083
+ Just y -> Bin 1 kx y Tip Tip
3084
+ Nothing -> Tip
3082
3085
mapMaybeWithKey f (Bin _ kx x l r) = case f kx x of
3083
3086
Just y -> link kx y (mapMaybeWithKey f l) (mapMaybeWithKey f r)
3084
3087
Nothing -> link2 (mapMaybeWithKey f l) (mapMaybeWithKey f r)
@@ -3091,7 +3094,7 @@ traverseMaybeWithKey :: Applicative f
3091
3094
traverseMaybeWithKey = go
3092
3095
where
3093
3096
go _ Tip = pure Tip
3094
- go f (Bin _ kx x Tip Tip ) = maybe Tip (\ x' -> Bin 1 kx x' Tip Tip ) <$> f kx x
3097
+ go f (Bin 1 kx x _ _ ) = maybe Tip (\ x' -> Bin 1 kx x' Tip Tip ) <$> f kx x
3095
3098
go f (Bin _ kx x l r) = liftA3 combine (go f l) (f kx x) (go f r)
3096
3099
where
3097
3100
combine ! l' mx ! r' = case mx of
@@ -3123,7 +3126,7 @@ mapEither f m
3123
3126
mapEitherWithKey :: (k -> a -> Either b c ) -> Map k a -> (Map k b , Map k c )
3124
3127
mapEitherWithKey f0 t0 = toPair $ go f0 t0
3125
3128
where
3126
- go _ Tip = ( Tip :*: Tip )
3129
+ go _ Tip = Tip :*: Tip
3127
3130
go f (Bin _ kx x l r) = case f kx x of
3128
3131
Left y -> link kx y l1 r1 :*: link2 l2 r2
3129
3132
Right z -> link2 l1 r1 :*: link kx z l2 r2
@@ -3141,6 +3144,7 @@ mapEitherWithKey f0 t0 = toPair $ go f0 t0
3141
3144
map :: (a -> b ) -> Map k a -> Map k b
3142
3145
map f = go where
3143
3146
go Tip = Tip
3147
+ go (Bin 1 kx x _ _) = Bin 1 kx (f x) Tip Tip
3144
3148
go (Bin sx kx x l r) = Bin sx kx (f x) (go l) (go r)
3145
3149
-- We use a `go` function to allow `map` to inline. This makes
3146
3150
-- a big difference if someone uses `map (const x) m` instead
@@ -3161,6 +3165,7 @@ map f = go where
3161
3165
3162
3166
mapWithKey :: (k -> a -> b ) -> Map k a -> Map k b
3163
3167
mapWithKey _ Tip = Tip
3168
+ mapWithKey f (Bin 1 kx x _ _) = Bin 1 kx (f kx x) Tip Tip
3164
3169
mapWithKey f (Bin sx kx x l r) = Bin sx kx (f kx x) (mapWithKey f l) (mapWithKey f r)
3165
3170
3166
3171
#ifdef __GLASGOW_HASKELL__
@@ -3214,6 +3219,9 @@ mapAccumWithKey f a t
3214
3219
-- argument through the map in ascending order of keys.
3215
3220
mapAccumL :: (a -> k -> b -> (a ,c )) -> a -> Map k b -> (a ,Map k c )
3216
3221
mapAccumL _ a Tip = (a,Tip )
3222
+ mapAccumL f a (Bin 1 kx x _ _ ) =
3223
+ let (a1,x') = f a kx x
3224
+ in (a1,Bin 1 kx x' Tip Tip )
3217
3225
mapAccumL f a (Bin sx kx x l r) =
3218
3226
let (a1,l') = mapAccumL f a l
3219
3227
(a2,x') = f a1 kx x
@@ -3224,6 +3232,9 @@ mapAccumL f a (Bin sx kx x l r) =
3224
3232
-- argument through the map in descending order of keys.
3225
3233
mapAccumRWithKey :: (a -> k -> b -> (a ,c )) -> a -> Map k b -> (a ,Map k c )
3226
3234
mapAccumRWithKey _ a Tip = (a,Tip )
3235
+ mapAccumRWithKey f a (Bin 1 kx x _ _) =
3236
+ let (a0,x') = f a kx x
3237
+ in (a0,Bin 1 kx x' Tip Tip )
3227
3238
mapAccumRWithKey f a (Bin sx kx x l r) =
3228
3239
let (a1,r') = mapAccumRWithKey f a r
3229
3240
(a2,x') = f a1 kx x
@@ -3307,6 +3318,7 @@ foldr :: (a -> b -> b) -> b -> Map k a -> b
3307
3318
foldr f z = go z
3308
3319
where
3309
3320
go z' Tip = z'
3321
+ go z' (Bin 1 _ x _ _) = f x z'
3310
3322
go z' (Bin _ _ x l r) = go (f x (go z' r)) l
3311
3323
{-# INLINE foldr #-}
3312
3324
@@ -3316,8 +3328,9 @@ foldr f z = go z
3316
3328
foldr' :: (a -> b -> b ) -> b -> Map k a -> b
3317
3329
foldr' f z = go z
3318
3330
where
3319
- go ! z' Tip = z'
3320
- go z' (Bin _ _ x l r) = go (f x $! go z' r) l
3331
+ go ! z' Tip = z'
3332
+ go ! z' (Bin 1 _ x _ _) = f x z'
3333
+ go z' (Bin _ _ x l r) = go (f x $! go z' r) l
3321
3334
{-# INLINE foldr' #-}
3322
3335
3323
3336
-- | \(O(n)\). Fold the values in the map using the given left-associative
@@ -3333,6 +3346,7 @@ foldl :: (a -> b -> a) -> a -> Map k b -> a
3333
3346
foldl f z = go z
3334
3347
where
3335
3348
go z' Tip = z'
3349
+ go z' (Bin 1 _ x _ _) = f z' x
3336
3350
go z' (Bin _ _ x l r) = go (f (go z' l) x) r
3337
3351
{-# INLINE foldl #-}
3338
3352
@@ -3342,8 +3356,9 @@ foldl f z = go z
3342
3356
foldl' :: (a -> b -> a ) -> a -> Map k b -> a
3343
3357
foldl' f z = go z
3344
3358
where
3345
- go ! z' Tip = z'
3346
- go z' (Bin _ _ x l r) =
3359
+ go ! z' Tip = z'
3360
+ go ! z' (Bin 1 _ x _ _) = f z' x
3361
+ go z' (Bin _ _ x l r) =
3347
3362
let ! z'' = go z' l
3348
3363
in go (f z'' x) r
3349
3364
{-# INLINE foldl' #-}
@@ -3361,7 +3376,8 @@ foldl' f z = go z
3361
3376
foldrWithKey :: (k -> a -> b -> b ) -> b -> Map k a -> b
3362
3377
foldrWithKey f z = go z
3363
3378
where
3364
- go z' Tip = z'
3379
+ go z' Tip = z'
3380
+ go z' (Bin 1 kx x _ _) = f kx x z'
3365
3381
go z' (Bin _ kx x l r) = go (f kx x (go z' r)) l
3366
3382
{-# INLINE foldrWithKey #-}
3367
3383
@@ -3372,7 +3388,8 @@ foldrWithKey' :: (k -> a -> b -> b) -> b -> Map k a -> b
3372
3388
foldrWithKey' f z = go z
3373
3389
where
3374
3390
go ! z' Tip = z'
3375
- go z' (Bin _ kx x l r) = go (f kx x $! go z' r) l
3391
+ go ! z' (Bin 1 kx x _ _) = f kx x z'
3392
+ go z' (Bin _ kx x l r) = go (f kx x $! go z' r) l
3376
3393
{-# INLINE foldrWithKey' #-}
3377
3394
3378
3395
-- | \(O(n)\). Fold the keys and values in the map using the given left-associative
@@ -3389,6 +3406,7 @@ foldlWithKey :: (a -> k -> b -> a) -> a -> Map k b -> a
3389
3406
foldlWithKey f z = go z
3390
3407
where
3391
3408
go z' Tip = z'
3409
+ go z' (Bin 1 kx x _ _) = f z' kx x
3392
3410
go z' (Bin _ kx x l r) = go (f (go z' l) kx x) r
3393
3411
{-# INLINE foldlWithKey #-}
3394
3412
@@ -3399,6 +3417,7 @@ foldlWithKey' :: (a -> k -> b -> a) -> a -> Map k b -> a
3399
3417
foldlWithKey' f z = go z
3400
3418
where
3401
3419
go ! z' Tip = z'
3420
+ go ! z' (Bin 1 kx x _ _) = f z' kx x
3402
3421
go z' (Bin _ kx x l r) =
3403
3422
let ! z'' = go z' l
3404
3423
in go (f z'' kx x) r
@@ -4393,6 +4412,7 @@ instance Functor (Map k) where
4393
4412
fmap f m = map f m
4394
4413
#ifdef __GLASGOW_HASKELL__
4395
4414
_ <$ Tip = Tip
4415
+ a <$ (Bin 1 kx _ _ _) = Bin 1 kx a Tip Tip
4396
4416
a <$ (Bin sx kx _ l r) = Bin sx kx a (a <$ l) (a <$ r)
4397
4417
#endif
4398
4418
0 commit comments