monoidmap-internal 0.0.0.1 → 0.1.0.0
raw patch · 4 files changed
+163/−3 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.MonoidMap.Internal: instance (Data.Data.Data k, Data.Data.Data v, GHC.Classes.Ord k, Data.Monoid.Null.MonoidNull v) => Data.Data.Data (Data.MonoidMap.Internal.MonoidMap k v)
Files
- CHANGELOG.md +4/−0
- components/monoidmap-internal/Data/MonoidMap/Internal.hs +34/−1
- components/monoidmap-test/Data/MonoidMap/Internal/ExampleSpec.hs +124/−1
- monoidmap-internal.cabal +1/−1
CHANGELOG.md view
@@ -1,3 +1,7 @@+# 0.1.0.0++- Made `MonoidMap` an instance of both `Typeable` and `Data`.+ # 0.0.0.1 - Revised version bounds of dependencies.
components/monoidmap-internal/Data/MonoidMap/Internal.hs view
@@ -164,6 +164,15 @@ ( Bifoldable ) import Data.Coerce ( coerce )+import Data.Data+ ( Constr+ , Data (dataCast2, dataTypeOf, gfoldl, gunfold, toConstr)+ , DataType+ , Fixity (Prefix)+ , gcast2+ , mkConstr+ , mkDataType+ ) import Data.Function ( (&) ) import Data.Functor.Classes@@ -204,6 +213,8 @@ ) import Data.Set ( Set )+import Data.Typeable+ ( Typeable ) import GHC.Exts ( IsList (Item) ) import NoThunks.Class@@ -232,7 +243,7 @@ -------------------------------------------------------------------------------- newtype MonoidMap k v = MonoidMap (Map k (NonNull v))- deriving (Eq, Show, NFData, NoThunks)+ deriving (Eq, Show, NFData, NoThunks, Typeable) via Map k v deriving (Eq1, Show1, Foldable) via Map k@@ -277,6 +288,28 @@ Read (MonoidMap k v) where readPrec = fromMap <$> readPrec++--------------------------------------------------------------------------------+-- Instances: Data+--------------------------------------------------------------------------------++-- This implementation is closely based on the 'Data' instance for 'Map'+-- provided by the 'containers' package (version 0.8).+--+instance (Data k, Data v, Ord k, MonoidNull v) => Data (MonoidMap k v) where+ dataTypeOf _ = dataType+ dataCast2 f = gcast2 f+ gfoldl f z m = z fromList `f` toList m+ gunfold k z c+ | c == fromListConstr = k (z fromList)+ | otherwise = error "gunfold MonoidMap: unexpected constructor"+ toConstr _ = fromListConstr++dataType :: DataType+dataType = mkDataType "Data.MonoidMap.Internal.MonoidMap" [fromListConstr]++fromListConstr :: Constr+fromListConstr = mkConstr dataType "fromList" [] Prefix -------------------------------------------------------------------------------- -- Instances: Semigroup and subclasses
components/monoidmap-test/Data/MonoidMap/Internal/ExampleSpec.hs view
@@ -1,4 +1,6 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE OverloadedLists #-}+{-# LANGUAGE RankNTypes #-} {-# OPTIONS_GHC -fno-warn-orphans #-} {- HLINT ignore "Redundant bracket" -} {- HLINT ignore "Use camelCase" -}@@ -14,10 +16,14 @@ import Prelude hiding ( gcd, lcm ) +import Data.Data+ ( Data, cast, gmapT ) import Data.Function ( (&) ) import Data.Group ( Group (..) )+import Data.Maybe+ ( fromMaybe ) import Data.Monoid ( Product (..), Sum (..) ) import Data.Monoid.GCD@@ -66,6 +72,18 @@ exampleSpec_disjoint_Sum_Natural exampleSpec_disjoint_Set_Natural + describe "Data" $ do++ exampleSpec_gmapT_keys_id+ exampleSpec_gmapT_keys_div_2+ exampleSpec_gmapT_keys_mod_2+ exampleSpec_gmapT_keys_mul_2++ exampleSpec_gmapT_values_id+ exampleSpec_gmapT_values_div_2+ exampleSpec_gmapT_values_mod_2+ exampleSpec_gmapT_values_mul_2+ describe "Intersection" $ do exampleSpec_intersectionWith_min_Sum_Natural@@ -328,6 +346,111 @@ m = MonoidMap.fromList . zip [A ..] . fmap Set.fromList --------------------------------------------------------------------------------+-- Data+--------------------------------------------------------------------------------++exampleSpec_gmapT_keys_id :: Spec+exampleSpec_gmapT_keys_id =+ unitTestSpec "gmapT_keys" "id"+ (mapNaturals id)+ (unitTestData1+ [ ( [(1, "a"), (2, "b"), (3, "c"), (4, "d")] :: MonoidMap Natural String+ , [(1, "a"), (2, "b"), (3, "c"), (4, "d")] :: MonoidMap Natural String+ )+ ]+ )++exampleSpec_gmapT_keys_div_2 :: Spec+exampleSpec_gmapT_keys_div_2 =+ unitTestSpec "gmapT_keys" "div_2"+ (mapNaturals (`div` 2))+ (unitTestData1+ [ ( [(2, "a"), (4, "b"), (6, "c"), (8, "d")] :: MonoidMap Natural String+ , [(1, "a"), (2, "b"), (3, "c"), (4, "d")] :: MonoidMap Natural String+ )+ ]+ )++exampleSpec_gmapT_keys_mod_2 :: Spec+exampleSpec_gmapT_keys_mod_2 =+ unitTestSpec "gmapT_keys" "mod_2"+ (mapNaturals (`mod` 2))+ (unitTestData1+ [ ( [(0, "a"), (2, "b"), (1, "c"), (3, "d")] :: MonoidMap Natural String+ , [(0, "a" <> "b"), (1, "c" <> "d")] :: MonoidMap Natural String+ )+ ]+ )++exampleSpec_gmapT_keys_mul_2 :: Spec+exampleSpec_gmapT_keys_mul_2 =+ unitTestSpec "gmapT_keys" "mul_2"+ (mapNaturals (* 2))+ (unitTestData1+ [ ( [(1, "a"), (2, "b"), (3, "c"), (4, "d")] :: MonoidMap Natural String+ , [(2, "a"), (4, "b"), (6, "c"), (8, "d")] :: MonoidMap Natural String+ )+ ]+ )++exampleSpec_gmapT_values_id :: Spec+exampleSpec_gmapT_values_id =+ unitTestSpec "gmapT_values" "id"+ (mapNaturals id)+ (unitTestData1+ [ ( [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)+ , [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)+ )+ ]+ )++exampleSpec_gmapT_values_div_2 :: Spec+exampleSpec_gmapT_values_div_2 =+ unitTestSpec "gmapT_values" "div_2"+ (mapNaturals (`div` 2))+ (unitTestData1+ [ ( [(A, 2), (B, 4), (C, 6), (D, 8)] :: MonoidMap LatinChar (Sum Natural)+ , [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)+ )+ ]+ )++exampleSpec_gmapT_values_mod_2 :: Spec+exampleSpec_gmapT_values_mod_2 =+ unitTestSpec "gmapT_values" "mod_2"+ (mapNaturals (`mod` 2))+ (unitTestData1+ [ ( [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)+ , [(A, 1), (C, 1) ] :: MonoidMap LatinChar (Sum Natural)+ )+ ]+ )++exampleSpec_gmapT_values_mul_2 :: Spec+exampleSpec_gmapT_values_mul_2 =+ unitTestSpec "gmapT_values" "mul_2"+ (mapNaturals (* 2))+ (unitTestData1+ [ ( [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)+ , [(A, 2), (B, 4), (C, 6), (D, 8)] :: MonoidMap LatinChar (Sum Natural)+ )+ ]+ )++mapNaturals :: Data a => (Natural -> Natural) -> a -> a+mapNaturals f =+ everywhereT $ \x ->+ case (cast x) of+ Just (n :: Natural) ->+ fromMaybe+ (error "mapNaturals")+ (cast (f n))+ Nothing -> x++everywhereT :: Data a => (forall b. Data b => b -> b) -> a -> a+everywhereT f x = f (gmapT (everywhereT f) x)++-------------------------------------------------------------------------------- -- Intersection -------------------------------------------------------------------------------- @@ -1735,4 +1858,4 @@ data LatinChar = A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z- deriving (Bounded, Enum, Eq, Ord, Show)+ deriving (Bounded, Enum, Eq, Ord, Show, Data)
monoidmap-internal.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: monoidmap-internal-version: 0.0.0.1+version: 0.1.0.0 bug-reports: https://github.com/jonathanknowles/monoidmap-internal/issues license: Apache-2.0 license-file: LICENSE