haskus-utils-variant 2.6 → 2.6.1
raw patch · 3 files changed
+169/−7 lines, 3 filesdep ~haskus-utils-typesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: haskus-utils-types
API changes (from Hackage documentation)
- Haskus.Utils.VariantF: instance GHC.Classes.Eq (Haskus.Utils.Variant.V (Haskus.Utils.VariantF.ApplyAll e xs)) => GHC.Classes.Eq (Haskus.Utils.VariantF.VariantF xs e)
- Haskus.Utils.VariantF: instance GHC.Classes.Ord (Haskus.Utils.Variant.V (Haskus.Utils.VariantF.ApplyAll e xs)) => GHC.Classes.Ord (Haskus.Utils.VariantF.VariantF xs e)
- Haskus.Utils.VariantF: instance GHC.Show.Show (Haskus.Utils.Variant.V (Haskus.Utils.VariantF.ApplyAll e xs)) => GHC.Show.Show (Haskus.Utils.VariantF.VariantF xs e)
+ Haskus.Utils.VariantF: instance (Data.Functor.Classes.Eq1 (Haskus.Utils.VariantF.VariantF xs), Haskus.Utils.Types.Constraint.ConstraintAll1 Data.Functor.Classes.Eq1 xs, GHC.Classes.Eq e) => GHC.Classes.Eq (Haskus.Utils.VariantF.VariantF xs e)
+ Haskus.Utils.VariantF: instance (Data.Functor.Classes.Eq1 f, Data.Functor.Classes.Eq1 (Haskus.Utils.VariantF.VariantF fs)) => Data.Functor.Classes.Eq1 (Haskus.Utils.VariantF.VariantF (f : fs))
+ Haskus.Utils.VariantF: instance (Data.Functor.Classes.Ord1 (Haskus.Utils.VariantF.VariantF xs), Haskus.Utils.Types.Constraint.ConstraintAll1 Data.Functor.Classes.Ord1 xs, Haskus.Utils.Types.Constraint.ConstraintAll1 Data.Functor.Classes.Eq1 xs, GHC.Classes.Ord e) => GHC.Classes.Ord (Haskus.Utils.VariantF.VariantF xs e)
+ Haskus.Utils.VariantF: instance (Data.Functor.Classes.Ord1 f, Data.Functor.Classes.Ord1 (Haskus.Utils.VariantF.VariantF fs)) => Data.Functor.Classes.Ord1 (Haskus.Utils.VariantF.VariantF (f : fs))
+ Haskus.Utils.VariantF: instance (Data.Functor.Classes.Show1 (Haskus.Utils.VariantF.VariantF xs), Haskus.Utils.Types.Constraint.ConstraintAll1 Data.Functor.Classes.Show1 xs, GHC.Show.Show e) => GHC.Show.Show (Haskus.Utils.VariantF.VariantF xs e)
+ Haskus.Utils.VariantF: instance (Data.Functor.Classes.Show1 f, Data.Functor.Classes.Show1 (Haskus.Utils.VariantF.VariantF fs)) => Data.Functor.Classes.Show1 (Haskus.Utils.VariantF.VariantF (f : fs))
+ Haskus.Utils.VariantF: instance Data.Functor.Classes.Eq1 (Haskus.Utils.VariantF.VariantF '[])
+ Haskus.Utils.VariantF: instance Data.Functor.Classes.Ord1 (Haskus.Utils.VariantF.VariantF '[])
+ Haskus.Utils.VariantF: instance Data.Functor.Classes.Show1 (Haskus.Utils.VariantF.VariantF '[])
Files
- haskus-utils-variant.cabal +2/−2
- src/lib/Haskus/Utils/EADT.hs +31/−0
- src/lib/Haskus/Utils/VariantF.hs +136/−5
haskus-utils-variant.cabal view
@@ -1,5 +1,5 @@ name: haskus-utils-variant-version: 2.6+version: 2.6.1 synopsis: Variant and EADT license: BSD3 license-file: LICENSE@@ -39,7 +39,7 @@ , deepseq , exceptions >= 0.9 , template-haskell- , haskus-utils-types >= 1.3+ , haskus-utils-types >= 1.4.1 , haskus-utils-data build-tools:
src/lib/Haskus/Utils/EADT.hs view
@@ -48,7 +48,38 @@ import GHC.Exts (Constraint) import Control.DeepSeq +-- $setup+-- >>> :set -XDataKinds+-- >>> :set -XTypeApplications+-- >>> :set -XTypeOperators+-- >>> :set -XFlexibleContexts+-- >>> :set -XTypeFamilies+-- >>> :set -XPatternSynonyms+-- >>> :set -XDeriveFunctor+-- >>> import Data.Functor.Classes+-- >>> data ConsF a e = ConsF a e deriving (Functor)+-- >>> data NilF e = NilF deriving (Functor)+-- >>> instance Eq a => Eq1 (ConsF a) where liftEq cmp (ConsF a e1) (ConsF b e2) = a == b && cmp e1 e2+-- >>> instance Eq1 NilF where liftEq _ _ _ = True+-- >>> :{+-- >>> pattern Cons :: ConsF a :<: xs => a -> EADT xs -> EADT xs+-- >>> pattern Cons a l = VF (ConsF a l)+-- >>> pattern Nil :: NilF :<: xs => EADT xs+-- >>> pattern Nil = VF NilF+-- >>> type List a = EADT '[ConsF a, NilF]+-- >>> :}++ -- | An extensible ADT+--+-- >>> VF NilF == (VF NilF :: EADT '[ConsF Int, NilF])+-- True+-- >>> let a = Cons "Hello" (Cons "World" Nil) :: List String+-- >>> let b = Cons "Bonjour" (Cons "Monde" Nil) :: List String+-- >>> a == b+-- False+-- >>> a == a+-- True type EADT xs = Fix (VariantF xs) -- TODO: GHC 8.6
src/lib/Haskus/Utils/VariantF.hs view
@@ -52,13 +52,46 @@ import Haskus.Utils.Variant import Haskus.Utils.Functor import Haskus.Utils.Types.List+import Haskus.Utils.Types.Constraint import Haskus.Utils.ContFlow import Unsafe.Coerce import Data.Bifunctor-import GHC.Exts (Any,Constraint)+import GHC.Exts (Any) import Control.DeepSeq+import Data.Functor.Classes +-- $setup+-- >>> :set -XDataKinds+-- >>> :set -XTypeApplications+-- >>> :set -XTypeOperators+-- >>> :set -XFlexibleContexts+-- >>> :set -XTypeFamilies+-- >>> :set -XPatternSynonyms+-- >>> :set -XDeriveFunctor+-- >>> import Data.Functor.Classes+-- >>>+-- >>> data ConsF a e = ConsF a e deriving (Functor)+-- >>> data NilF e = NilF deriving (Functor)+-- >>>+-- >>> instance Eq a => Eq1 (ConsF a) where liftEq cmp (ConsF a e1) (ConsF b e2) = a == b && cmp e1 e2+-- >>> instance Eq1 NilF where liftEq _ _ _ = True+-- >>>+-- >>> instance Ord a => Ord1 (ConsF a) where liftCompare cmp (ConsF a e1) (ConsF b e2) = compare a b <> cmp e1 e2+-- >>> instance Ord1 NilF where liftCompare _ _ _ = EQ+-- >>>+-- >>> instance Show a => Show1 (ConsF a) where liftShowsPrec shw _ p (ConsF a e) = showString "ConsF " . showsPrec 10 a . showString " " . shw 10 e+-- >>> instance Show1 NilF where liftShowsPrec _ _ _ _ = showString "NilF"+-- >>>+-- >>> liftEq (==) NilF (NilF :: NilF Int)+-- True+-- >>> liftEq (==) (ConsF 10 "Test") (ConsF 10 "Test" :: ConsF Int String)+-- True+-- >>> liftEq (==) (ConsF 10 "Test") (ConsF 8 "Test" :: ConsF Int String)+-- False+-- >>> liftEq (==) (ConsF 10 "Test") (ConsF 10 "XXX" :: ConsF Int String)+-- False+ -- | Recursive Functor-like Variant newtype VariantF (xs :: [* -> *]) e = VariantF (V (ApplyAll e xs))@@ -71,10 +104,108 @@ ApplyAll e '[] = '[] ApplyAll e (f ': fs) = f e ': ApplyAll e fs -instance (Show (V (ApplyAll e xs))) => Show (VariantF xs e) where- show (VariantF x) = show x-deriving instance (Eq (V (ApplyAll e xs))) => Eq (VariantF xs e)-deriving instance (Ord (V (ApplyAll e xs))) => Ord (VariantF xs e)+-- | Eq instance for VariantF+--+-- >>> let a = FV (ConsF 'a' "Test") :: VariantF '[ConsF Char,NilF] String+-- >>> let a' = FV (ConsF 'a' "XXX") :: VariantF '[ConsF Char,NilF] String+-- >>> let b = FV (ConsF 'b' "Test") :: VariantF '[ConsF Char,NilF] String+-- >>> a == a+-- True+-- >>> a == a'+-- False+-- >>> a == b+-- False+--+-- >>> let c = FV (ConsF 'c' b) :: VariantF '[ConsF Char,NilF] (VariantF '[ConsF Char, NilF] String)+-- >>> c == c+-- True+--+-- >>> let n1 = FV (NilF :: NilF ()) :: VariantF '[ConsF Char,NilF] ()+-- >>> let n2 = FV (NilF :: NilF ()) :: VariantF '[ConsF Char,NilF] ()+-- >>> n1 == n2+-- True+--+instance+ ( Eq1 (VariantF xs)+ , ConstraintAll1 Eq1 xs+ , Eq e+ ) => Eq (VariantF xs e)+ where+ (==) = eq1++-- | Ord instance for VariantF+--+-- >>> let a = FV (ConsF 'a' "Test") :: VariantF '[ConsF Char,NilF] String+-- >>> let a' = FV (ConsF 'a' "XXX") :: VariantF '[ConsF Char,NilF] String+-- >>> let b = FV (ConsF 'b' "Test") :: VariantF '[ConsF Char,NilF] String+-- >>> compare a a+-- EQ+-- >>> compare a a'+-- LT+-- >>> compare a b+-- LT+instance+ ( Ord1 (VariantF xs)+ , ConstraintAll1 Ord1 xs+ , ConstraintAll1 Eq1 xs+ , Ord e+ ) => Ord (VariantF xs e)+ where+ compare = compare1+++instance Eq1 (VariantF '[]) where+ liftEq = undefined++instance+ ( Eq1 f+ , Eq1 (VariantF fs)+ ) => Eq1 (VariantF (f:fs)) where+ liftEq cmp x y = case (popVariantFHead x, popVariantFHead y) of+ (Right a, Right b) -> liftEq cmp a b+ (Left a, Left b) -> liftEq cmp a b+ _ -> False++instance Ord1 (VariantF '[]) where+ liftCompare = undefined++instance+ ( Ord1 f+ , Ord1 (VariantF fs)+ ) => Ord1 (VariantF (f:fs)) where+ liftCompare cmp x@(VariantF v1) y@(VariantF v2) =+ case (popVariantFHead x, popVariantFHead y) of+ (Right a, Right b) -> liftCompare cmp a b+ (Left a, Left b) -> liftCompare cmp a b+ _ -> compare (variantIndex v1) (variantIndex v2)+++instance Show1 (VariantF '[]) where+ liftShowsPrec = undefined++instance+ ( Show1 f+ , Show1 (VariantF fs)+ ) => Show1 (VariantF (f:fs)) where+ liftShowsPrec shw shwl p x = case popVariantFHead x of+ Right a -> liftShowsPrec shw shwl p a+ Left a -> liftShowsPrec shw shwl p a++-- | Show instance for VariantF+--+-- >>> let a = FV (ConsF 'a' "Test") :: VariantF '[ConsF Char,NilF] String+-- >>> let b = FV (NilF :: NilF String) :: VariantF '[ConsF Char,NilF] String+-- >>> print a+-- ConsF 'a' "Test"+-- >>> print b+-- NilF+instance+ ( Show1 (VariantF xs)+ , ConstraintAll1 Show1 xs+ , Show e+ ) => Show (VariantF xs e)+ where+ showsPrec = showsPrec1 instance Functor (VariantF '[]) where fmap _ = undefined