Skip to content

Commit f21b72c

Browse files
committed
Add foldlWithKeyM and foldrWithKeyM
1 parent e74ac0b commit f21b72c

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

containers/src/Data/Map/Internal.hs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,10 @@ module Data.Map.Internal (
259259
, foldrWithKey'
260260
, foldlWithKey'
261261

262+
-- ** Monadic folds
263+
, foldlWithKeyM
264+
, foldrWithKeyM
265+
262266
-- * Conversion
263267
, elems
264268
, keys
@@ -3315,6 +3319,34 @@ foldlWithKey' f z = go z
33153319
in go (f z'' kx x) r
33163320
{-# INLINE foldlWithKey' #-}
33173321

3322+
-- | /O(n)/. Monadic variant of 'foldlWithKey'.
3323+
--
3324+
-- > 'foldlWithKeyM\'' f z0 (fromList [(0,'a'),(1,'b'),(2,'c')]) =
3325+
-- > f z0 0 'a' >>= (\z1 -> f z1 1 'b' >>= (\z2 -> f z2 2 'c'))
3326+
foldlWithKeyM :: Monad m => (a -> k -> b -> m a) -> a -> Map k b -> m a
3327+
foldlWithKeyM f z = go z
3328+
where
3329+
go z' Tip = return z'
3330+
go z' (Bin _ kx x l r) = do
3331+
z'' <- go z' l
3332+
z''' <- f z'' kx x
3333+
go z''' r
3334+
{-# INLINE foldlWithKeyM #-}
3335+
3336+
-- | /O(n)/. Monadic variant of 'foldrWithKey'.
3337+
--
3338+
-- > 'foldrWithKeyM\'' f z0 (fromList [(0,'a'),(1,'b'),(2,'c')]) =
3339+
-- > (f 2 'c' >=> f 1 'b' >=> f 0 'a') z0
3340+
foldrWithKeyM :: Monad m => (k -> a -> b -> m b) -> b -> Map k a -> m b
3341+
foldrWithKeyM f z = go z
3342+
where
3343+
go z' Tip = return z'
3344+
go z' (Bin _ kx x l r) = do
3345+
z'' <- go z' r
3346+
z''' <- f kx x z''
3347+
go z''' l
3348+
{-# INLINE foldrWithKeyM #-}
3349+
33183350
-- | \(O(n)\). Fold the keys and values in the map using the given monoid, such that
33193351
--
33203352
-- @'foldMapWithKey' f = 'Prelude.fold' . 'mapWithKey' f@

0 commit comments

Comments
 (0)