packages feed

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 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