WeakSets 1.6.0.0 → 1.6.1.0
raw patch · 3 files changed
+86/−6 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Data.Simplifiable: instance (Data.Simplifiable.GSimplifiable a, Data.Simplifiable.GSimplifiable b) => Data.Simplifiable.GSimplifiable (a GHC.Generics.:*: b)
+ Data.Simplifiable: instance (Data.Simplifiable.GSimplifiable a, Data.Simplifiable.GSimplifiable b) => Data.Simplifiable.GSimplifiable (a GHC.Generics.:+: b)
+ Data.Simplifiable: instance Data.Simplifiable.GSimplifiable GHC.Generics.U1
+ Data.Simplifiable: instance Data.Simplifiable.GSimplifiable a => Data.Simplifiable.GSimplifiable (GHC.Generics.M1 i c a)
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable ()
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Int.Int16
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Int.Int32
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Int.Int64
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Int.Int8
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Num.Integer.Integer
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Types.Ordering
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Types.Word
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Word.Word16
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Word.Word32
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Word.Word64
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable GHC.Word.Word8
+ Data.Simplifiable: instance Data.Simplifiable.Simplifiable a => Data.Simplifiable.GSimplifiable (GHC.Generics.K1 i a)
- Data.Simplifiable: simplify :: Simplifiable a => a -> a
+ Data.Simplifiable: simplify :: (Simplifiable a, Generic a, GSimplifiable (Rep a)) => a -> a
Files
- CHANGELOG.md +5/−1
- WeakSets.cabal +2/−2
- src/Data/Simplifiable.hs +79/−3
CHANGELOG.md view
@@ -78,4 +78,8 @@ # 1.6.0.0 -- 2023-11-03 -* Removing PureSet as they are useless. MonadPlus and MonadFail for Set. Simplifiable typeclass to remove duplicates in Set and Map.+* Removing PureSet as they are useless. MonadPlus and MonadFail for Set. Simplifiable typeclass to remove duplicates in Set and Map. + +# 1.6.1.0 -- 2023-11-05 + +* Adding Generic derivation of Simplifiable typeclass.
WeakSets.cabal view
@@ -14,7 +14,7 @@ -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change -version: 1.6.0.0 +version: 1.6.1.0 -- A short (one-line) description of the package. synopsis: @@ -63,7 +63,7 @@ -- other-modules: -- LANGUAGE extensions used by modules in this package. - -- other-extensions: + other-extensions: DefaultSignatures, TypeOperators, FlexibleContexts -- Other library packages from which modules are imported. build-depends: base >= 4 && < 5
src/Data/Simplifiable.hs view
@@ -1,3 +1,7 @@+{-# LANGUAGE DefaultSignatures #-} +{-# LANGUAGE TypeOperators #-} +{-# LANGUAGE FlexibleContexts #-} + {-| Module : WeakSets Description : A container may be simplified internally by the call of a function 'simplify'. This is the case for 'WeakSet's and 'WeakMap's where duplicate elements remain in the container until the end of the lifetime of the container. Calling 'simplify' on them will remove duplicate elements. @@ -9,6 +13,8 @@ A container may be simplified internally by the call of a function 'simplify'. This is the case for 'WeakSet's and 'WeakMap's where duplicate elements remain in the container until the end of the lifetime of the container. Calling 'simplify' on them will remove duplicate elements. + +To derive automatically 'Simplifiable', add language extensions 'DeriveAnyClass' and 'DeriveGeneric', import 'GHC.Generics' and add 'Generic' and 'Simplifiable' to the derived typeclasses of your datatype. (For example : "data Foo a = Foo (Set a) deriving (Generic, Simplifiable)".) -} @@ -22,6 +28,9 @@ import qualified Data.WeakMap as Map import Data.WeakMap.Safe import qualified Data.List as List + import Data.Int + import Data.Word + import GHC.Generics import Numeric.Natural @@ -32,23 +41,89 @@ -- | A function to simplify a container recursively. simplify :: a -> a + default simplify :: (Generic a, GSimplifiable (Rep a)) => a -> a + simplify a = to $ gsimplify (from a) + + class GSimplifiable f where + gsimplify :: f a -> f a + + instance GSimplifiable U1 where + gsimplify U1 = U1 + + instance (GSimplifiable a, GSimplifiable b) => GSimplifiable (a :*: b) where + gsimplify (a :*: b) = (gsimplify a) :*: (gsimplify b) + + instance (GSimplifiable a, GSimplifiable b) => GSimplifiable (a :+: b) where + gsimplify (L1 a) = L1 $ gsimplify a + gsimplify (R1 b) = R1 $ gsimplify b + + + instance (GSimplifiable a) => GSimplifiable (M1 i c a) where + gsimplify (M1 a) = M1 $ gsimplify a + + instance (Simplifiable a) => GSimplifiable (K1 i a) where + gsimplify (K1 x) = K1 $ simplify x + + + + + + + instance Simplifiable Bool where simplify = id instance Simplifiable Char where simplify = id + + instance Simplifiable Double where + simplify = id + instance Simplifiable Float where + simplify = id + instance Simplifiable Int where simplify = id + instance Simplifiable Int8 where + simplify = id + + instance Simplifiable Int16 where + simplify = id + + instance Simplifiable Int32 where + simplify = id + + instance Simplifiable Int64 where + simplify = id + + instance Simplifiable Integer where + simplify = id + instance Simplifiable Natural where simplify = id + + instance Simplifiable Ordering where + simplify = id + + instance Simplifiable Word where + simplify = id - instance Simplifiable Float where + instance Simplifiable Word8 where simplify = id - instance Simplifiable Double where + instance Simplifiable Word16 where simplify = id + + instance Simplifiable Word32 where + simplify = id + + instance Simplifiable Word64 where + simplify = id + + instance Simplifiable () where + simplify = id + instance (Simplifiable a, Simplifiable b) => Simplifiable (a,b) where simplify (a,b) = (simplify a, simplify b) @@ -76,4 +151,5 @@ instance (Simplifiable a, Simplifiable b) => Simplifiable (Either a b) where simplify (Left a) = Left $ simplify a - simplify (Right a) = Right $ simplify a+ simplify (Right a) = Right $ simplify a +