monoidmap-internal 0.1.0.4 → 0.1.1.0
raw patch · 5 files changed
+178/−22 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.MonoidMap.Internal: nullifyKeysIn :: Ord k => Set k -> MonoidMap k v -> MonoidMap k v
+ Data.MonoidMap.Internal: nullifyKeysNotIn :: Ord k => Set k -> MonoidMap k v -> MonoidMap k v
Files
- CHANGELOG.md +4/−0
- components/monoidmap-internal/Data/MonoidMap/Internal.hs +58/−1
- components/monoidmap-test/Data/MonoidMap/Internal/MembershipSpec.hs +76/−20
- components/monoidmap-test/Test/Combinators/OftenEqual.hs +38/−0
- monoidmap-internal.cabal +2/−1
CHANGELOG.md view
@@ -1,3 +1,7 @@+# 0.1.1.0++- Added functions `nullifyKeysIn` and `nullifyKeysNotIn` to `MonoidMap`.+ # 0.1.0.4 - Updated links to source repository in package metadata.
components/monoidmap-internal/Data/MonoidMap/Internal.hs view
@@ -38,7 +38,11 @@ -- ** Modification , set , adjust++ -- ** Nullification , nullify+ , nullifyKeysIn+ , nullifyKeysNotIn -- ** Membership , null@@ -657,16 +661,69 @@ adjust f k (MonoidMap m) = MonoidMap $ Map.alter (maybeNonNull . maybe (f mempty) (applyNonNull f)) k m +--------------------------------------------------------------------------------+-- Nullification+--------------------------------------------------------------------------------+ -- | \(O(\log n)\). Sets the value associated with the given key to 'mempty'. -- -- Satisfies the following property: -- -- @--- 'get' k ('nullify' k m) '==' 'mempty'+-- 'get' k1 ('nullify' k2 m) '=='+-- if k1 '==' k2+-- then 'mempty'+-- else 'get' k1 m -- @ -- nullify :: Ord k => k -> MonoidMap k v -> MonoidMap k v nullify k (MonoidMap m) = MonoidMap $ Map.delete k m++-- | \(O\bigl(m \log\bigl(\frac{n}{m}+1\bigr)\bigr), \; 0 < m \leq n\).+--+-- Sets the values associated with all keys in the given set to 'mempty'.+--+-- Satisfies the following properties:+--+-- @+-- 'get' k ('nullifyKeysIn' ks m) '=='+-- if 'Set'.'Set.member' k ks+-- then 'mempty'+-- else 'get' k m+-- @+--+-- @+-- 'nullifyKeysIn' ks m '=='+-- 'fromMap' ('Map'.'Map.withoutKeys' ('toMap' m) ks)+-- @+--+-- @since 0.0.6.0+--+nullifyKeysIn :: Ord k => Set k -> MonoidMap k v -> MonoidMap k v+nullifyKeysIn ks (MonoidMap m) = MonoidMap $ m `Map.withoutKeys` ks++-- | \(O\bigl(m \log\bigl(\frac{n}{m}+1\bigr)\bigr), \; 0 < m \leq n\).+--+-- Sets the values associated with all keys not in the given set to 'mempty'.+--+-- Satisfies the following properties:+--+-- @+-- 'get' k ('nullifyKeysNotIn' ks m) '=='+-- if 'Set'.'Set.notMember' k ks+-- then 'mempty'+-- else 'get' k m+-- @+--+-- @+-- 'nullifyKeysNotIn' ks m '=='+-- 'fromMap' ('Map'.'Map.restrictKeys' ('toMap' m) ks)+-- @+--+-- @since 0.0.6.0+--+nullifyKeysNotIn :: Ord k => Set k -> MonoidMap k v -> MonoidMap k v+nullifyKeysNotIn ks (MonoidMap m) = MonoidMap $ m `Map.restrictKeys` ks -------------------------------------------------------------------------------- -- Membership
components/monoidmap-test/Data/MonoidMap/Internal/MembershipSpec.hs view
@@ -20,6 +20,10 @@ ( MonoidMap ) import Data.Proxy ( Proxy (..) )+import Data.Set+ ( Set )+import Test.Combinators.OftenEqual+ ( OftenEqual (OftenEqual) ) import Test.Common ( Key , Test@@ -45,6 +49,9 @@ specFor :: forall k v. Test k v => Proxy k -> Proxy v -> Spec specFor = makeSpec $ do + it "prop_nonNullKeys_get" $+ prop_nonNullKeys_get+ @k @v & property it "prop_nullify_get" $ prop_nullify_get @k @v & property@@ -54,20 +61,47 @@ it "prop_nullify_nonNullKeys" $ prop_nullify_nonNullKeys @k @v & property- it "prop_nonNullKeys_get" $- prop_nonNullKeys_get+ it "prop_nullifyKeysIn_get" $+ prop_nullifyKeysIn_get @k @v & property+ it "prop_nullifyKeysNotIn_get" $+ prop_nullifyKeysNotIn_get+ @k @v & property +prop_nonNullKeys_get+ :: Test k v => MonoidMap k v -> Property+prop_nonNullKeys_get m =+ fmap+ (\k -> (k, MonoidMap.get k m))+ (Set.toList (MonoidMap.nonNullKeys m))+ === MonoidMap.toList m+ & cover 2+ (MonoidMap.null m)+ "MonoidMap.null m"+ & cover 2+ (not (MonoidMap.null m))+ "not (MonoidMap.null m)"+ prop_nullify_get- :: Test k v => MonoidMap k v -> k -> Property-prop_nullify_get m k =- MonoidMap.get k (MonoidMap.nullify k m) === mempty+ :: Test k v => MonoidMap k v -> OftenEqual k -> Property+prop_nullify_get m (OftenEqual k1 k2) =+ MonoidMap.get k1 (MonoidMap.nullify k2 m) ===+ (if k1 == k2 then mempty else MonoidMap.get k1 m) & cover 2- (MonoidMap.nonNullKey k m)- "MonoidMap.nonNullKey k m"+ (k1 == k2 && MonoidMap.nonNullKey k1 m)+ "k1 == k2 && MonoidMap.nonNullKey k1 m" & cover 2- (not (MonoidMap.nonNullKey k m))- "not (MonoidMap.nonNullKey k m)"+ (k1 == k2 && MonoidMap.nullKey k1 m)+ "k1 == k2 && MonoidMap.nullKey k1 m"+ & cover 2+ (k1 /= k2 && MonoidMap.nonNullKey k1 m)+ "k1 /= k2 && MonoidMap.nonNullKey k1 m"+ & cover 2+ (k1 /= k2 && MonoidMap.nullKey k1 m)+ "k1 /= k2 && MonoidMap.nullKey k1 m"+ & cover 2+ (k1 /= k2 && MonoidMap.nonNullKey k1 m && MonoidMap.nonNullKey k2 m)+ "k1 /= k2 && MonoidMap.nonNullKey k1 m && MonoidMap.nonNullKey k2 m" prop_nullify_nonNullKey :: Test k v => MonoidMap k v -> k -> Property@@ -91,16 +125,38 @@ (not (MonoidMap.nonNullKey k m)) "not (MonoidMap.nonNullKey k m)" -prop_nonNullKeys_get- :: Test k v => MonoidMap k v -> Property-prop_nonNullKeys_get m =- fmap- (\k -> (k, MonoidMap.get k m))- (Set.toList (MonoidMap.nonNullKeys m))- === MonoidMap.toList m+prop_nullifyKeysIn_get+ :: Test k v => MonoidMap k v -> Set k -> k -> Property+prop_nullifyKeysIn_get m ks k =+ MonoidMap.get k (MonoidMap.nullifyKeysIn ks m) ===+ (if Set.member k ks then mempty else MonoidMap.get k m) & cover 2- (MonoidMap.null m)- "MonoidMap.null m"+ (Set.member k ks && MonoidMap.nullKey k m)+ "Set.member k ks && MonoidMap.nullKey k m" & cover 2- (not (MonoidMap.null m))- "not (MonoidMap.null m)"+ (Set.member k ks && MonoidMap.nonNullKey k m)+ "Set.member k ks && MonoidMap.nonNullKey k m"+ & cover 2+ (Set.notMember k ks && MonoidMap.nullKey k m)+ "Set.notMember k ks && MonoidMap.nullKey k m"+ & cover 2+ (Set.notMember k ks && MonoidMap.nonNullKey k m)+ "Set.notMember k ks && MonoidMap.nonNullKey k m"++prop_nullifyKeysNotIn_get+ :: Test k v => MonoidMap k v -> Set k -> k -> Property+prop_nullifyKeysNotIn_get m ks k =+ MonoidMap.get k (MonoidMap.nullifyKeysNotIn ks m) ===+ (if Set.notMember k ks then mempty else MonoidMap.get k m)+ & cover 2+ (Set.member k ks && MonoidMap.nullKey k m)+ "Set.member k ks && MonoidMap.nullKey k m"+ & cover 2+ (Set.member k ks && MonoidMap.nonNullKey k m)+ "Set.member k ks && MonoidMap.nonNullKey k m"+ & cover 2+ (Set.notMember k ks && MonoidMap.nullKey k m)+ "Set.notMember k ks && MonoidMap.nullKey k m"+ & cover 2+ (Set.notMember k ks && MonoidMap.nonNullKey k m)+ "Set.notMember k ks && MonoidMap.nonNullKey k m"
+ components/monoidmap-test/Test/Combinators/OftenEqual.hs view
@@ -0,0 +1,38 @@+-- |+-- Copyright: © 2022–2026 Jonathan Knowles+-- License: Apache-2.0+--+module Test.Combinators.OftenEqual+ ( OftenEqual (OftenEqual)+ , genOftenEqual+ , shrinkOftenEqual+ )+ where++import Prelude++import Test.QuickCheck+ ( Arbitrary (arbitrary, shrink)+ , Arbitrary2 (liftShrink2)+ , Gen+ , oneof+ )++-- | A pair of values that are equal at least half of the time.+data OftenEqual a = OftenEqual !a !a+ deriving (Eq, Show)++genOftenEqual :: Gen a -> Gen (OftenEqual a)+genOftenEqual genA = do+ a1 <- genA+ a2 <- oneof [pure a1, genA]+ pure $ OftenEqual a1 a2++shrinkOftenEqual :: Eq a => (a -> [a]) -> OftenEqual a -> [OftenEqual a]+shrinkOftenEqual shrinkA (OftenEqual a1 a2)+ | a1 == a2 = [OftenEqual a a | a <- shrinkA a1]+ | otherwise = uncurry OftenEqual <$> liftShrink2 shrinkA shrinkA (a1, a2)++instance (Arbitrary a, Eq a) => Arbitrary (OftenEqual a) where+ arbitrary = genOftenEqual arbitrary+ shrink = shrinkOftenEqual shrink
monoidmap-internal.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: monoidmap-internal-version: 0.1.0.4+version: 0.1.1.0 homepage: https://github.com/jonathanknowles/monoidmap/tree/HEAD/packages/monoidmap-internal bug-reports: https://github.com/jonathanknowles/monoidmap/issues license: Apache-2.0@@ -160,6 +160,7 @@ Data.MonoidMap.Internal.UnionSpec Data.MonoidMap.Internal.ValiditySpec Test.Combinators.NonZero+ Test.Combinators.OftenEqual Test.Common Test.Hspec.Unit Test.Key