monoidmap 0.0.2.1 → 0.0.3.0
raw patch · 8 files changed
+128/−1 lines, 8 files
Files
- CHANGELOG.md +4/−0
- monoidmap.cabal +1/−1
- src/examples/Examples/RecoveredMap.hs +4/−0
- src/internal/Data/MonoidMap/Internal.hs +23/−0
- src/public/Data/MonoidMap.hs +1/−0
- src/test/Data/MonoidMap/MapSpec.hs +74/−0
- src/test/Data/MonoidMap/ValiditySpec.hs +8/−0
- src/test/Examples/RecoveredMapSpec.hs +13/−0
CHANGELOG.md view
@@ -1,3 +1,7 @@+# 0.0.3.0++- Added the `mapWithKey` function to `MonoidMap`.+ # 0.0.2.1 - Added support for GHC 9.12.
monoidmap.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: monoidmap-version: 0.0.2.1+version: 0.0.3.0 bug-reports: https://github.com/jonathanknowles/monoidmap/issues license: Apache-2.0 license-file: LICENSE
src/examples/Examples/RecoveredMap.hs view
@@ -20,6 +20,7 @@ , lookup , member , map+ , mapWithKey , mapAccumL , mapAccumLWithKey , mapAccumR@@ -91,6 +92,9 @@ map :: (v1 -> v2) -> Map k v1 -> Map k v2 map f = Map . MonoidMap.map (fmap f) . unMap++mapWithKey :: (k -> v1 -> v2) -> Map k v1 -> Map k v2+mapWithKey f = Map . MonoidMap.mapWithKey (fmap . f) . unMap mapAccumL :: (s -> v1 -> (s, v2)) -> s -> Map k v1 -> (s, Map k v2) mapAccumL f s m = Map <$> MonoidMap.mapAccumL (accum f) s (unMap m)
src/internal/Data/MonoidMap/Internal.hs view
@@ -65,6 +65,7 @@ , map , mapKeys , mapKeysWith+ , mapWithKey -- ** Folding , foldl@@ -1004,6 +1005,28 @@ -> MonoidMap k1 v -> MonoidMap k2 v mapKeysWith combine fk = fromListWith combine . fmap (B.first fk) . toList++-- | \(O(n)\). Applies a key-dependent function to all non-'C.null' values of+-- a 'MonoidMap'.+--+-- Satisfies the following properties for all functions __@f@__:+--+-- @+-- ('nonNullKey' k m) ==> ('get' k ('mapWithKey' f m) '==' f k ('get' k m))+-- ( 'nullKey' k m) ==> ('get' k ('mapWithKey' f m) '==' 'mempty' )+-- @+--+-- @since 0.0.3.0+--+mapWithKey+ :: MonoidNull v2+ => (k -> v1 -> v2)+ -> MonoidMap k v1+ -> MonoidMap k v2+mapWithKey f (MonoidMap m) =+ MonoidMap . runIdentity $+ Map.traverseMaybeWithKey+ (\k v -> Identity $ maybeNonNull $ applyNonNull (f k) v) m -------------------------------------------------------------------------------- -- Lazy folding
src/public/Data/MonoidMap.hs view
@@ -64,6 +64,7 @@ , map , mapKeys , mapKeysWith+ , mapWithKey -- ** Folding , foldl
src/test/Data/MonoidMap/MapSpec.hs view
@@ -71,6 +71,18 @@ it "prop_mapKeysWith_asList" $ prop_mapKeysWith_asList @k @v & property+ it "prop_mapWithKey_asList" $+ prop_mapWithKey_asList+ @k @v & property+ it "prop_mapWithKey_get" $+ prop_mapWithKey_get+ @k @v & property+ it "prop_mapWithKey_get_total" $+ prop_mapWithKey_get_total+ @k @v & property+ it "prop_mapWithKey_get_total_failure" $+ prop_mapWithKey_get_total_failure+ @k @v & property -------------------------------------------------------------------------------- -- Mapping@@ -206,6 +218,68 @@ "0 < nonNullCount n && nonNullCount n < nonNullCount m" where n = MonoidMap.mapKeysWith c f m++prop_mapWithKey_asList+ :: Test k v+ => Fun (k, v) v+ -> MonoidMap k v+ -> Property+prop_mapWithKey_asList (applyFun2 -> f) m =+ n ===+ ( MonoidMap.fromList+ . fmap (\(k, v) -> (k, (f k v)))+ . MonoidMap.toList+ $ m+ )+ & cover 2+ (0 < nonNullCount n && nonNullCount n < nonNullCount m)+ "0 < nonNullCount n && nonNullCount n < nonNullCount m"+ where+ n = MonoidMap.mapWithKey f m++prop_mapWithKey_get+ :: Test k v+ => Fun (k, v) v+ -> k+ -> MonoidMap k v+ -> Property+prop_mapWithKey_get (applyFun2 -> f) k m =+ MonoidMap.get k (MonoidMap.mapWithKey f m)+ ===+ (if MonoidMap.nullKey k m then mempty else f k (MonoidMap.get k m))+ & cover 2+ (MonoidMap.nullKey k m)+ "MonoidMap.nullKey k m"+ & cover 2+ (MonoidMap.nonNullKey k m)+ "MonoidMap.nonNullKey k m"++prop_mapWithKey_get_total+ :: forall k v. Test k v+ => Fun (k, v) v+ -> k+ -> MonoidMap k v+ -> Property+prop_mapWithKey_get_total (applyFun2 -> f0) k m =+ MonoidMap.get k (MonoidMap.mapWithKey f m) === f k (MonoidMap.get k m)+ & cover 2+ (MonoidMap.nullKey k m)+ "MonoidMap.nullKey k m"+ & cover 2+ (MonoidMap.nonNullKey k m)+ "MonoidMap.nonNullKey k m"+ where+ f = toNullPreservingFn . f0++prop_mapWithKey_get_total_failure+ :: Test k v+ => Fun (k, v) v+ -> k+ -> MonoidMap k v+ -> Property+prop_mapWithKey_get_total_failure (applyFun2 -> f) k m =+ expectFailure $+ MonoidMap.get k (MonoidMap.mapWithKey f m) === f k (MonoidMap.get k m) -------------------------------------------------------------------------------- -- Utilities
src/test/Data/MonoidMap/ValiditySpec.hs view
@@ -192,6 +192,9 @@ it "propValid_mapKeysWith" $ propValid_mapKeysWith @k @v & property+ it "propValid_mapWithKey" $+ propValid_mapWithKey+ @k @v & property it "propValid_mapAccumL" $ propValid_mapAccumL @k @v & property@@ -503,6 +506,11 @@ :: Test k v => Fun (v, v) v -> Fun k k -> MonoidMap k v -> Property propValid_mapKeysWith (applyFun2 -> f) (applyFun -> g) m = propValid (MonoidMap.mapKeysWith f g m)++propValid_mapWithKey+ :: Test k v => Fun (k, v) v -> MonoidMap k v -> Property+propValid_mapWithKey (applyFun2 -> f) m =+ propValid (MonoidMap.mapWithKey f m) propValid_mapAccumL :: forall k v s. s ~ Int
src/test/Examples/RecoveredMapSpec.hs view
@@ -189,6 +189,9 @@ it "prop_map_mempty" $ prop_map_mempty @k @v @v & property+ it "prop_mapWithKey" $+ prop_mapWithKey+ @k @v @v & property describe "MapAccumL" $ do it "prop_mapAccumL @Int" $@@ -497,6 +500,16 @@ (===) (RMap.toList (RMap.map (const (mempty @v2)) (RMap.fromList kvs))) (OMap.toList (OMap.map (const (mempty @v2)) (OMap.fromList kvs)))++prop_mapWithKey+ :: (Ord k, Show k, Eq v2, Show v2)+ => [(k, v1)]+ -> Fun (k, v1) v2+ -> Property+prop_mapWithKey kvs (applyFun2 -> f) =+ (===)+ (RMap.toList (RMap.mapWithKey f (RMap.fromList kvs)))+ (OMap.toList (OMap.mapWithKey f (OMap.fromList kvs))) -------------------------------------------------------------------------------- -- MapAccum