diff --git a/.gitignore b/.gitignore index 6747517..f6b8b18 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ cabal.sandbox.config .stack-work/ tarballs/ *~ +dist-newstyle/ diff --git a/mono-traversable/ChangeLog.md b/mono-traversable/ChangeLog.md index 4f0b449..c417a51 100644 --- a/mono-traversable/ChangeLog.md +++ b/mono-traversable/ChangeLog.md @@ -1,5 +1,10 @@ # ChangeLog for mono-traversable +## 1.0.19.0 + +* Added `filterWithKey` to `IsMap`. + [#232](https://github.com/snoyberg/mono-traversable/pull/232) + ## 1.0.18.0 * Added MonoPointed instance for text Builder diff --git a/mono-traversable/mono-traversable.cabal b/mono-traversable/mono-traversable.cabal index 5e8710d..f2b5386 100644 --- a/mono-traversable/mono-traversable.cabal +++ b/mono-traversable/mono-traversable.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: mono-traversable -version: 1.0.18.0 +version: 1.0.19.0 synopsis: Type classes for mapping, folding, and traversing monomorphic containers description: Please see the README at category: Data diff --git a/mono-traversable/package.yaml b/mono-traversable/package.yaml index d8a68e4..0bae5d6 100644 --- a/mono-traversable/package.yaml +++ b/mono-traversable/package.yaml @@ -1,5 +1,5 @@ name: mono-traversable -version: 1.0.18.0 +version: 1.0.19.0 synopsis: Type classes for mapping, folding, and traversing monomorphic containers description: Please see the README at category: Data diff --git a/mono-traversable/src/Data/Containers.hs b/mono-traversable/src/Data/Containers.hs index 31322e8..1dd5801 100644 --- a/mono-traversable/src/Data/Containers.hs +++ b/mono-traversable/src/Data/Containers.hs @@ -548,8 +548,15 @@ class (MonoTraversable map, SetContainer map) => IsMap map where -- | Filter values in a map. -- -- @since 1.0.9.0 - filterMap :: IsMap map => (MapValue map -> Bool) -> map -> map - filterMap p = mapFromList . filter (p . snd) . mapToList + filterMap :: (MapValue map -> Bool) -> map -> map + filterMap = filterWithKey . const + + -- | Equivalent to 'filterMap', but the function accepts the key, + -- as well as the value. + -- + -- @since 1.0.19.0 + filterWithKey :: (ContainerKey map -> MapValue map -> Bool) -> map -> map + filterWithKey p = mapFromList . filter (uncurry p) . mapToList -- | This instance uses the functions from "Data.Map.Strict". instance Ord key => IsMap (Map.Map key value) where @@ -599,6 +606,8 @@ instance Ord key => IsMap (Map.Map key value) where {-# INLINE omapKeysWith #-} filterMap = Map.filter {-# INLINE filterMap #-} + filterWithKey = Map.filterWithKey + {-# INLINE filterWithKey #-} -- | This instance uses the functions from "Data.HashMap.Strict". instance (Eq key, Hashable key) => IsMap (HashMap.HashMap key value) where @@ -636,6 +645,8 @@ instance (Eq key, Hashable key) => IsMap (HashMap.HashMap key value) where --mapKeysWith = HashMap.mapKeysWith filterMap = HashMap.filter {-# INLINE filterMap #-} + filterWithKey = HashMap.filterWithKey + {-# INLINE filterWithKey #-} -- | This instance uses the functions from "Data.IntMap.Strict". instance IsMap (IntMap.IntMap value) where @@ -684,6 +695,8 @@ instance IsMap (IntMap.IntMap value) where {-# INLINE omapKeysWith #-} filterMap = IntMap.filter {-# INLINE filterMap #-} + filterWithKey = IntMap.filterWithKey + {-# INLINE filterWithKey #-} instance Eq key => IsMap [(key, value)] where type MapValue [(key, value)] = value