Repository : ssh://[email protected]/containers On branch : ghc-head Link : http://git.haskell.org/?p=packages/containers.git;a=commit;h=40187f32a43689ff02ca2b97465aa4fcd9f9d150
>--------------------------------------------------------------- commit 40187f32a43689ff02ca2b97465aa4fcd9f9d150 Author: Edward Kmett <[email protected]> Date: Tue Dec 25 05:57:40 2012 -0500 Added `foldMapWithKey`. >--------------------------------------------------------------- 40187f32a43689ff02ca2b97465aa4fcd9f9d150 Data/IntMap/Base.hs | 15 +++++++++++++++ Data/IntMap/Lazy.hs | 2 ++ Data/IntMap/Strict.hs | 2 ++ Data/Map/Base.hs | 14 ++++++++++++++ Data/Map/Lazy.hs | 2 ++ Data/Map/Strict.hs | 2 ++ 6 files changed, 37 insertions(+) diff --git a/Data/IntMap/Base.hs b/Data/IntMap/Base.hs index 73b05b2..05dd3fa 100644 --- a/Data/IntMap/Base.hs +++ b/Data/IntMap/Base.hs @@ -123,6 +123,8 @@ module Data.IntMap.Base ( , foldl , foldrWithKey , foldlWithKey + , foldMapWithKey + -- ** Strict folds , foldr' , foldl' @@ -1670,6 +1672,19 @@ foldlWithKey' f z = \t -> -- Use lambda t to be inlinable with two argument go z' (Bin _ _ l r) = go (go z' l) r {-# INLINE foldlWithKey' #-} +-- | /O(n)/. Fold the keys and values in the map using the given monoid, such that +-- +-- @'foldMapWithKey' f = 'Prelude.fold' . 'mapWithKey' f@ +-- +-- This can be an asymptotically faster than 'foldrWithKey' or 'foldlWithKey' for some monoids. +foldMapWithKey :: Monoid m => (Key -> a -> m) -> IntMap a -> m +foldMapWithKey f = go + where + go Nil = mempty + go (Tip kx x) = f kx x + go (Bin _ _ l r) = go l `mappend` go r +{-# INLINE foldMapWithKey #-} + {-------------------------------------------------------------------- List variations --------------------------------------------------------------------} diff --git a/Data/IntMap/Lazy.hs b/Data/IntMap/Lazy.hs index fed6538..6de26f8 100644 --- a/Data/IntMap/Lazy.hs +++ b/Data/IntMap/Lazy.hs @@ -133,6 +133,8 @@ module Data.IntMap.Lazy ( , IM.foldl , foldrWithKey , foldlWithKey + , foldMapWithKey + -- ** Strict folds , foldr' , foldl' diff --git a/Data/IntMap/Strict.hs b/Data/IntMap/Strict.hs index e6b3708..168d7a8 100644 --- a/Data/IntMap/Strict.hs +++ b/Data/IntMap/Strict.hs @@ -139,6 +139,8 @@ module Data.IntMap.Strict ( , foldl , foldrWithKey , foldlWithKey + , foldMapWithKey + -- ** Strict folds , foldr' , foldl' diff --git a/Data/Map/Base.hs b/Data/Map/Base.hs index 3e240e8..670cdd0 100644 --- a/Data/Map/Base.hs +++ b/Data/Map/Base.hs @@ -169,6 +169,8 @@ module Data.Map.Base ( , foldl , foldrWithKey , foldlWithKey + , foldMapWithKey + -- ** Strict folds , foldr' , foldl' @@ -1873,6 +1875,18 @@ foldlWithKey' f z = go z go z' (Bin _ kx x l r) = go (f (go z' l) kx x) r {-# INLINE foldlWithKey' #-} +-- | /O(n)/. Fold the keys and values in the map using the given monoid, such that +-- +-- @'foldMapWithKey' f = 'Prelude.fold' . 'mapWithKey' f@ +-- +-- This can be an asymptotically faster than 'foldrWithKey' or 'foldlWithKey' for some monoids. +foldMapWithKey :: Monoid m => (k -> a -> m) -> Map k a -> m +foldMapWithKey f = go + where + go Tip = mempty + go (Bin _ k v l r) = go l `mappend` f k v `mappend` go r +{-# INLINE foldMapWithKey #-} + {-------------------------------------------------------------------- List variations --------------------------------------------------------------------} diff --git a/Data/Map/Lazy.hs b/Data/Map/Lazy.hs index e637376..1b939f7 100644 --- a/Data/Map/Lazy.hs +++ b/Data/Map/Lazy.hs @@ -129,6 +129,8 @@ module Data.Map.Lazy ( , M.foldl , foldrWithKey , foldlWithKey + , foldMapWithKey + -- ** Strict folds , foldr' , foldl' diff --git a/Data/Map/Strict.hs b/Data/Map/Strict.hs index faa0478..9e91f40 100644 --- a/Data/Map/Strict.hs +++ b/Data/Map/Strict.hs @@ -136,6 +136,8 @@ module Data.Map.Strict , foldl , foldrWithKey , foldlWithKey + , foldMapWithKey + -- ** Strict folds , foldr' , foldl' _______________________________________________ ghc-commits mailing list [email protected] http://www.haskell.org/mailman/listinfo/ghc-commits
