Hello community, here is the log from the commit of package ghc-generics-sop for openSUSE:Factory checked in at 2017-02-21 13:45:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-generics-sop (Old) and /work/SRC/openSUSE:Factory/.ghc-generics-sop.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "ghc-generics-sop" Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-generics-sop/ghc-generics-sop.changes 2017-01-12 15:49:21.558391746 +0100 +++ /work/SRC/openSUSE:Factory/.ghc-generics-sop.new/ghc-generics-sop.changes 2017-02-21 13:45:33.540837397 +0100 @@ -1,0 +2,5 @@ +Sun Feb 5 19:32:20 UTC 2017 - psimons@suse.com + +- Update to version 0.2.4.0 with cabal2obs. + +------------------------------------------------------------------- Old: ---- generics-sop-0.2.3.0.tar.gz New: ---- generics-sop-0.2.4.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-generics-sop.spec ++++++ --- /var/tmp/diff_new_pack.ljIqif/_old 2017-02-21 13:45:33.952779282 +0100 +++ /var/tmp/diff_new_pack.ljIqif/_new 2017-02-21 13:45:33.956778717 +0100 @@ -1,7 +1,7 @@ # # spec file for package ghc-generics-sop # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %global pkg_name generics-sop Name: ghc-%{pkg_name} -Version: 0.2.3.0 +Version: 0.2.4.0 Release: 0 Summary: Generic Programming using True Sums of Products License: BSD-3-Clause ++++++ generics-sop-0.2.3.0.tar.gz -> generics-sop-0.2.4.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/generics-sop-0.2.3.0/CHANGELOG.md new/generics-sop-0.2.4.0/CHANGELOG.md --- old/generics-sop-0.2.3.0/CHANGELOG.md 2016-12-04 11:26:01.000000000 +0100 +++ new/generics-sop-0.2.4.0/CHANGELOG.md 2017-02-02 14:06:35.000000000 +0100 @@ -1,4 +1,12 @@ -# 0.2.3.0 +# 0.2.4.0 (2017-02-02) + +* Add `hindex` (and `index_NS` and `index_SOP`). + +* Add `hapInjs` as a generalization of `apInjs_NP` and `apInjs_POP`. + +* Make basic functors instances of lifted classes (such as `Eq1` etc). + +# 0.2.3.0 (2016-12-04) * Add various metadata getters @@ -25,7 +33,7 @@ `Projection` and `projections` as duals of `Injection` and `injections`. -# 0.2 (2015-10-23) +# 0.2.0.0 (2015-10-23) * Now tested with ghc-7.10 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/generics-sop-0.2.3.0/generics-sop.cabal new/generics-sop-0.2.4.0/generics-sop.cabal --- old/generics-sop-0.2.3.0/generics-sop.cabal 2016-12-04 11:26:01.000000000 +0100 +++ new/generics-sop-0.2.4.0/generics-sop.cabal 2017-02-02 14:06:35.000000000 +0100 @@ -1,5 +1,5 @@ name: generics-sop -version: 0.2.3.0 +version: 0.2.4.0 synopsis: Generic Programming using True Sums of Products description: A library to support the definition of generic functions. @@ -37,7 +37,7 @@ build-type: Simple cabal-version: >=1.10 extra-source-files: CHANGELOG.md -tested-with: GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.1 +tested-with: GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.1, GHC == 8.0.2, GHC == 8.1.* source-repository head type: git @@ -61,8 +61,11 @@ build-depends: base >= 4.6 && < 5, template-haskell >= 2.8 && < 2.13, ghc-prim >= 0.3 && < 0.6 - if impl (ghc < 7.8) + if !impl (ghc >= 7.8) build-depends: tagged >= 0.7 && < 0.9 + if !impl (ghc >= 8.0) + build-depends: transformers-compat >= 0.3 && < 0.6, + transformers >= 0.3 && < 0.6 hs-source-dirs: src default-language: Haskell2010 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/generics-sop-0.2.3.0/src/Generics/SOP/BasicFunctors.hs new/generics-sop-0.2.4.0/src/Generics/SOP/BasicFunctors.hs --- old/generics-sop-0.2.3.0/src/Generics/SOP/BasicFunctors.hs 2016-12-04 11:26:01.000000000 +0100 +++ new/generics-sop-0.2.4.0/src/Generics/SOP/BasicFunctors.hs 2017-02-02 14:06:35.000000000 +0100 @@ -39,6 +39,20 @@ #endif import qualified GHC.Generics as GHC +import Data.Functor.Classes + +#if MIN_VERSION_base(4,9,0) +#define LIFTED_CLASSES 1 +#else +#if MIN_VERSION_transformers(0,5,0) +#define LIFTED_CLASSES 1 +#else +#if MIN_VERSION_transformers_compat(0,5,0) && !MIN_VERSION_transformers(0,4,0) +#define LIFTED_CLASSES 1 +#endif +#endif +#endif + -- | The constant type functor. -- -- Like 'Data.Functor.Constant.Constant', but kind-polymorphic @@ -46,9 +60,9 @@ -- newtype K (a :: *) (b :: k) = K a #if MIN_VERSION_base(4,7,0) - deriving (Show, Functor, Foldable, Traversable, GHC.Generic) + deriving (Functor, Foldable, Traversable, GHC.Generic) #else - deriving (Show, GHC.Generic) + deriving (GHC.Generic) instance Functor (K a) where fmap _ (K x) = K x @@ -61,6 +75,53 @@ traverse _ (K x) = pure (K x) #endif +#ifdef LIFTED_CLASSES +instance Eq2 K where + liftEq2 eq _ (K x) (K y) = eq x y +instance Ord2 K where + liftCompare2 comp _ (K x) (K y) = comp x y +instance Read2 K where + liftReadsPrec2 rp _ _ _ = readsData $ + readsUnaryWith rp "K" K +instance Show2 K where + liftShowsPrec2 sp _ _ _ d (K x) = showsUnaryWith sp "K" d x + +instance (Eq a) => Eq1 (K a) where + liftEq = liftEq2 (==) +instance (Ord a) => Ord1 (K a) where + liftCompare = liftCompare2 compare +instance (Read a) => Read1 (K a) where + liftReadsPrec = liftReadsPrec2 readsPrec readList +instance (Show a) => Show1 (K a) where + liftShowsPrec = liftShowsPrec2 showsPrec showList +#else +instance (Eq a) => Eq1 (K a) where + eq1 (K x) (K y) = x == y +instance (Ord a) => Ord1 (K a) where + compare1 (K x) (K y) = compare x y +instance (Read a) => Read1 (K a) where + readsPrec1 = readsData $ readsUnary "K" K +instance (Show a) => Show1 (K a) where + showsPrec1 d (K x) = showsUnary "K" d x +#endif + +-- This have to be implemented manually, K is polykinded. +instance (Eq a) => Eq (K a b) where + K x == K y = x == y +instance (Ord a) => Ord (K a b) where + compare (K x) (K y) = compare x y +#ifdef LIFTED_CLASSES +instance (Read a) => Read (K a b) where + readsPrec = readsData $ readsUnaryWith readsPrec "K" K +instance (Show a) => Show (K a b) where + showsPrec d (K x) = showsUnaryWith showsPrec "K" d x +#else +instance (Read a) => Read (K a b) where + readsPrec = readsData $ readsUnary "K" K +instance (Show a) => Show (K a b) where + showsPrec d (K x) = showsUnary "K" d x +#endif + instance Monoid a => Applicative (K a) where pure _ = K mempty K x <*> K y = K (x <> y) @@ -75,9 +136,9 @@ -- newtype I (a :: *) = I a #if MIN_VERSION_base(4,7,0) - deriving (Show, Functor, Foldable, Traversable, GHC.Generic) + deriving (Functor, Foldable, Traversable, GHC.Generic) #else - deriving (Show, GHC.Generic) + deriving (GHC.Generic) instance Functor I where fmap f (I x) = I (f x) @@ -98,6 +159,33 @@ return = I I x >>= f = f x + +#ifdef LIFTED_CLASSES +instance Eq1 I where + liftEq eq (I x) (I y) = eq x y +instance Ord1 I where + liftCompare comp (I x) (I y) = comp x y +instance Read1 I where + liftReadsPrec rp _ = readsData $ + readsUnaryWith rp "I" I +instance Show1 I where + liftShowsPrec sp _ d (I x) = showsUnaryWith sp "I" d x +#else +instance Eq1 I where + eq1 (I x) (I y) = x == y +instance Ord1 I where + compare1 (I x) (I y) = compare x y +instance Read1 I where + readsPrec1 = readsData $ readsUnary "I" I +instance Show1 I where + showsPrec1 d (I x) = showsUnary "I" d x +#endif + +instance (Eq a) => Eq (I a) where (==) = eq1 +instance (Ord a) => Ord (I a) where compare = compare1 +instance (Read a) => Read (I a) where readsPrec = readsPrec1 +instance (Show a) => Show (I a) where showsPrec = showsPrec1 + -- | Extract the contents of an 'I' value. unI :: I a -> a unI (I x) = x @@ -108,14 +196,81 @@ -- and with a shorter name. -- newtype (:.:) (f :: l -> *) (g :: k -> l) (p :: k) = Comp (f (g p)) - deriving (Show, GHC.Generic) + deriving (GHC.Generic) infixr 7 :.: instance (Functor f, Functor g) => Functor (f :.: g) where fmap f (Comp x) = Comp (fmap (fmap f) x) +-- Instances of lifted Prelude classes + +#ifdef LIFTED_CLASSES +instance (Eq1 f, Eq1 g) => Eq1 (f :.: g) where + liftEq eq (Comp x) (Comp y) = liftEq (liftEq eq) x y + +instance (Ord1 f, Ord1 g) => Ord1 (f :.: g) where + liftCompare comp (Comp x) (Comp y) = + liftCompare (liftCompare comp) x y + +instance (Read1 f, Read1 g) => Read1 (f :.: g) where + liftReadsPrec rp rl = readsData $ + readsUnaryWith (liftReadsPrec rp' rl') "Comp" Comp + where + rp' = liftReadsPrec rp rl + rl' = liftReadList rp rl + +instance (Show1 f, Show1 g) => Show1 (f :.: g) where + liftShowsPrec sp sl d (Comp x) = + showsUnaryWith (liftShowsPrec sp' sl') "Comp" d x + where + sp' = liftShowsPrec sp sl + sl' = liftShowList sp sl + +instance (Eq1 f, Eq1 g, Eq a) => Eq ((f :.: g) a) where (==) = eq1 +instance (Ord1 f, Ord1 g, Ord a) => Ord ((f :.: g) a) where compare = compare1 +instance (Read1 f, Read1 g, Read a) => Read ((f :.: g) a) where readsPrec = readsPrec1 +instance (Show1 f, Show1 g, Show a) => Show ((f :.: g) a) where showsPrec = showsPrec1 +#else +-- kludge to get type with the same instances as g a +newtype Apply g a = Apply (g a) + +getApply :: Apply g a -> g a +getApply (Apply x) = x + +instance (Eq1 g, Eq a) => Eq (Apply g a) where + Apply x == Apply y = eq1 x y + +instance (Ord1 g, Ord a) => Ord (Apply g a) where + compare (Apply x) (Apply y) = compare1 x y + +instance (Read1 g, Read a) => Read (Apply g a) where + readsPrec d s = [(Apply a, t) | (a, t) <- readsPrec1 d s] + +instance (Show1 g, Show a) => Show (Apply g a) where + showsPrec d (Apply x) = showsPrec1 d x + +instance (Functor f, Eq1 f, Eq1 g, Eq a) => Eq ((f :.: g) a) where + Comp x == Comp y = eq1 (fmap Apply x) (fmap Apply y) + +instance (Functor f, Ord1 f, Ord1 g, Ord a) => Ord ((f :.: g) a) where + compare (Comp x) (Comp y) = compare1 (fmap Apply x) (fmap Apply y) + +instance (Functor f, Read1 f, Read1 g, Read a) => Read ((f :.: g) a) where + readsPrec = readsData $ readsUnary1 "Comp" (Comp . fmap getApply) + +instance (Functor f, Show1 f, Show1 g, Show a) => Show ((f :.: g) a) where + showsPrec d (Comp x) = showsUnary1 "Comp" d (fmap Apply x) + +instance (Functor f, Eq1 f, Eq1 g) => Eq1 (f :.: g) where eq1 = (==) +instance (Functor f, Ord1 f, Ord1 g) => Ord1 (f :.: g) where + compare1 = compare +instance (Functor f, Read1 f, Read1 g) => Read1 (f :.: g) where + readsPrec1 = readsPrec +instance (Functor f, Show1 f, Show1 g) => Show1 (f :.: g) where + showsPrec1 = showsPrec +#endif + -- | Extract the contents of a 'Comp' value. unComp :: (f :.: g) p -> f (g p) unComp (Comp x) = x - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/generics-sop-0.2.3.0/src/Generics/SOP/Classes.hs new/generics-sop-0.2.4.0/src/Generics/SOP/Classes.hs --- old/generics-sop-0.2.3.0/src/Generics/SOP/Classes.hs 2016-12-04 11:26:01.000000000 +0100 +++ new/generics-sop-0.2.4.0/src/Generics/SOP/Classes.hs 2017-02-02 14:06:35.000000000 +0100 @@ -29,7 +29,45 @@ -- The actual instances are defined in "Generics.SOP.NP" and -- "Generics.SOP.NS". -- -module Generics.SOP.Classes where +module Generics.SOP.Classes + ( -- * Generalized applicative functor structure + -- ** Generalized 'Control.Applicative.pure' + HPure(..) + -- ** Generalized 'Control.Applicative.<*>' + , type (-.->)(..) + , fn + , fn_2 + , fn_3 + , fn_4 + , Prod + , HAp(..) + -- ** Derived functions + , hliftA + , hliftA2 + , hliftA3 + , hmap + , hzipWith + , hzipWith3 + , hcliftA + , hcliftA2 + , hcliftA3 + , hcmap + , hczipWith + , hczipWith3 + -- * Collapsing homogeneous structures + , CollapseTo + , HCollapse(..) + -- * Sequencing effects + , HSequence(..) + -- ** Derived functions + , hsequence + , hsequenceK + -- * Indexing into sums + , HIndex(..) + -- * Applying all injections + , UnProd + , HApInjs(..) + ) where #if !(MIN_VERSION_base(4,8,0)) import Control.Applicative (Applicative) @@ -38,6 +76,10 @@ import Generics.SOP.BasicFunctors import Generics.SOP.Constraint +-- * Generalized applicative functor structure + +-- ** Generalized 'Control.Applicative.pure' + -- | A generalization of 'Control.Applicative.pure' or -- 'Control.Monad.return' to higher kinds. class HPure (h :: (k -> *) -> (l -> *)) where @@ -46,7 +88,7 @@ -- /Instances:/ -- -- @ - -- 'hpure', 'Generics.SOP.NP.pure_NP' :: 'SListI' xs => (forall a. f a) -> 'Generics.SOP.NP.NP' f xs + -- 'hpure', 'Generics.SOP.NP.pure_NP' :: 'Generics.SOP.Sing.SListI' xs => (forall a. f a) -> 'Generics.SOP.NP.NP' f xs -- 'hpure', 'Generics.SOP.NP.pure_POP' :: 'SListI2' xss => (forall a. f a) -> 'Generics.SOP.NP.POP' f xss -- @ -- @@ -76,14 +118,10 @@ -- hcpure :: (AllN h c xs) => proxy c -> (forall a. c a => f a) -> h f xs -{------------------------------------------------------------------------------- - Application --------------------------------------------------------------------------------} +-- ** Generalized 'Control.Applicative.<*>' -- | Lifted functions. newtype (f -.-> g) a = Fn { apFn :: f a -> g a } - --- TODO: What is the right precedence? infixr 1 -.-> -- | Construct a lifted function. @@ -138,9 +176,7 @@ -- hap :: Prod h (f -.-> g) xs -> h f xs -> h g xs -{------------------------------------------------------------------------------- - Derived from application --------------------------------------------------------------------------------} +-- ** Derived functions -- | A generalized form of 'Control.Applicative.liftA', -- which in turn is a generalized 'map'. @@ -157,8 +193,8 @@ -- /Instances:/ -- -- @ --- 'hliftA', 'Generics.SOP.NP.liftA_NP' :: 'SListI' xs => (forall a. f a -> f' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NP.NP' f' xs --- 'hliftA', 'Generics.SOP.NS.liftA_NS' :: 'SListI' xs => (forall a. f a -> f' a) -> 'Generics.SOP.NS.NS' f xs -> 'Generics.SOP.NS.NS' f' xs +-- 'hliftA', 'Generics.SOP.NP.liftA_NP' :: 'Generics.SOP.Sing.SListI' xs => (forall a. f a -> f' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NP.NP' f' xs +-- 'hliftA', 'Generics.SOP.NS.liftA_NS' :: 'Generics.SOP.Sing.SListI' xs => (forall a. f a -> f' a) -> 'Generics.SOP.NS.NS' f xs -> 'Generics.SOP.NS.NS' f' xs -- 'hliftA', 'Generics.SOP.NP.liftA_POP' :: 'SListI2' xss => (forall a. f a -> f' a) -> 'Generics.SOP.NP.POP' f xss -> 'Generics.SOP.NP.POP' f' xss -- 'hliftA', 'Generics.SOP.NS.liftA_SOP' :: 'SListI2' xss => (forall a. f a -> f' a) -> 'Generics.SOP.NS.SOP' f xss -> 'Generics.SOP.NS.SOP' f' xss -- @ @@ -183,8 +219,8 @@ -- /Instances:/ -- -- @ --- 'hliftA2', 'Generics.SOP.NP.liftA2_NP' :: 'SListI' xs => (forall a. f a -> f' a -> f'' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NP.NP' f' xs -> 'Generics.SOP.NP.NP' f'' xs --- 'hliftA2', 'Generics.SOP.NS.liftA2_NS' :: 'SListI' xs => (forall a. f a -> f' a -> f'' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NS.NS' f' xs -> 'Generics.SOP.NS.NS' f'' xs +-- 'hliftA2', 'Generics.SOP.NP.liftA2_NP' :: 'Generics.SOP.Sing.SListI' xs => (forall a. f a -> f' a -> f'' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NP.NP' f' xs -> 'Generics.SOP.NP.NP' f'' xs +-- 'hliftA2', 'Generics.SOP.NS.liftA2_NS' :: 'Generics.SOP.Sing.SListI' xs => (forall a. f a -> f' a -> f'' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NS.NS' f' xs -> 'Generics.SOP.NS.NS' f'' xs -- 'hliftA2', 'Generics.SOP.NP.liftA2_POP' :: 'SListI2' xss => (forall a. f a -> f' a -> f'' a) -> 'Generics.SOP.NP.POP' f xss -> 'Generics.SOP.NP.POP' f' xss -> 'Generics.SOP.NP.POP' f'' xss -- 'hliftA2', 'Generics.SOP.NS.liftA2_SOP' :: 'SListI2' xss => (forall a. f a -> f' a -> f'' a) -> 'Generics.SOP.NP.POP' f xss -> 'Generics.SOP.NS.SOP' f' xss -> 'Generics.SOP.NS.SOP' f'' xss -- @ @@ -209,8 +245,8 @@ -- /Instances:/ -- -- @ --- 'hliftA3', 'Generics.SOP.NP.liftA3_NP' :: 'SListI' xs => (forall a. f a -> f' a -> f'' a -> f''' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NP.NP' f' xs -> 'Generics.SOP.NP.NP' f'' xs -> 'Generics.SOP.NP.NP' f''' xs --- 'hliftA3', 'Generics.SOP.NS.liftA3_NS' :: 'SListI' xs => (forall a. f a -> f' a -> f'' a -> f''' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NP.NP' f' xs -> 'Generics.SOP.NS.NS' f'' xs -> 'Generics.SOP.NS.NS' f''' xs +-- 'hliftA3', 'Generics.SOP.NP.liftA3_NP' :: 'Generics.SOP.Sing.SListI' xs => (forall a. f a -> f' a -> f'' a -> f''' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NP.NP' f' xs -> 'Generics.SOP.NP.NP' f'' xs -> 'Generics.SOP.NP.NP' f''' xs +-- 'hliftA3', 'Generics.SOP.NS.liftA3_NS' :: 'Generics.SOP.Sing.SListI' xs => (forall a. f a -> f' a -> f'' a -> f''' a) -> 'Generics.SOP.NP.NP' f xs -> 'Generics.SOP.NP.NP' f' xs -> 'Generics.SOP.NS.NS' f'' xs -> 'Generics.SOP.NS.NS' f''' xs -- 'hliftA3', 'Generics.SOP.NP.liftA3_POP' :: 'SListI2' xss => (forall a. f a -> f' a -> f'' a -> f''' a) -> 'Generics.SOP.NP.POP' f xss -> 'Generics.SOP.NP.POP' f' xss -> 'Generics.SOP.NP.POP' f'' xss -> 'Generics.SOP.NP.POP' f''' xs -- 'hliftA3', 'Generics.SOP.NS.liftA3_SOP' :: 'SListI2' xss => (forall a. f a -> f' a -> f'' a -> f''' a) -> 'Generics.SOP.NP.POP' f xss -> 'Generics.SOP.NP.POP' f' xss -> 'Generics.SOP.NS.SOP' f'' xss -> 'Generics.SOP.NP.SOP' f''' xs -- @ @@ -299,6 +335,8 @@ hczipWith = hcliftA2 hczipWith3 = hcliftA3 +-- * Collapsing homogeneous structures + -- | Maps products to lists, and sums to identities. type family CollapseTo (h :: (k -> *) -> (l -> *)) (x :: *) :: * @@ -326,6 +364,8 @@ -- hcollapse :: SListIN h xs => h (K a) xs -> CollapseTo h a +-- * Sequencing effects + -- | A generalization of 'Data.Traversable.sequenceA'. class HAp h => HSequence (h :: (k -> *) -> (l -> *)) where @@ -336,14 +376,16 @@ -- /Instances:/ -- -- @ - -- 'hsequence'', 'Generics.SOP.NP.sequence'_NP' :: ('SListI' xs , 'Applicative' f) => 'Generics.SOP.NP.NP' (f ':.:' g) xs -> f ('Generics.SOP.NP.NP' g xs ) - -- 'hsequence'', 'Generics.SOP.NS.sequence'_NS' :: ('SListI' xs , 'Applicative' f) => 'Generics.SOP.NS.NS' (f ':.:' g) xs -> f ('Generics.SOP.NS.NS' g xs ) + -- 'hsequence'', 'Generics.SOP.NP.sequence'_NP' :: ('Generics.SOP.Sing.SListI' xs , 'Applicative' f) => 'Generics.SOP.NP.NP' (f ':.:' g) xs -> f ('Generics.SOP.NP.NP' g xs ) + -- 'hsequence'', 'Generics.SOP.NS.sequence'_NS' :: ('Generics.SOP.Sing.SListI' xs , 'Applicative' f) => 'Generics.SOP.NS.NS' (f ':.:' g) xs -> f ('Generics.SOP.NS.NS' g xs ) -- 'hsequence'', 'Generics.SOP.NP.sequence'_POP' :: ('SListI2' xss, 'Applicative' f) => 'Generics.SOP.NP.POP' (f ':.:' g) xss -> f ('Generics.SOP.NP.POP' g xss) -- 'hsequence'', 'Generics.SOP.NS.sequence'_SOP' :: ('SListI2' xss, 'Applicative' f) => 'Generics.SOP.NS.SOP' (f ':.:' g) xss -> f ('Generics.SOP.NS.SOP' g xss) -- @ -- hsequence' :: (SListIN h xs, Applicative f) => h (f :.: g) xs -> f (h g xs) +-- ** Derived functions + -- | Special case of 'hsequence'' where @g = 'I'@. hsequence :: (SListIN h xs, SListIN (Prod h) xs, HSequence h) => Applicative f => h f xs -> f (h I xs) hsequence = hsequence' . hliftA (Comp . fmap I) @@ -351,3 +393,73 @@ -- | Special case of 'hsequence'' where @g = 'K' a@. hsequenceK :: (SListIN h xs, SListIN (Prod h) xs, Applicative f, HSequence h) => h (K (f a)) xs -> f (h (K a) xs) hsequenceK = hsequence' . hliftA (Comp . fmap K . unK) + +-- * Indexing into sums + +-- | A class for determining which choice in a sum-like structure +-- a value represents. +-- +class HIndex (h :: (k -> *) -> (l -> *)) where + + -- | If 'h' is a sum-like structure representing a choice + -- between @n@ different options, and @x@ is a value of + -- type @h f xs@, then @'hindex' x@ returns a number between + -- @0@ and @n - 1@ representing the index of the choice + -- made by @x@. + -- + -- /Instances:/ + -- + -- @ + -- 'hindex', 'Generics.SOP.NS.index_NS' :: 'Generics.SOP.NS.NS' f xs -> Int + -- 'hindex', 'Generics.SOP.NS.index_SOP' :: 'Generics.SOP.NS.SOP' f xs -> Int + -- @ + -- + -- /Examples:/ + -- + -- >>> hindex (S (S (Z (I False)))) + -- 2 + -- >>> hindex (Z (K ())) + -- 0 + -- >>> hindex (SOP (S (Z (I True :* I 'x' :* Nil)))) + -- 1 + -- + -- @since 0.2.4.0 + -- + hindex :: h f xs -> Int + +-- * Applying all injections + +-- | Maps a structure containing products to the corresponding +-- sum structure. +-- +-- @since 0.2.4.0 +-- +type family UnProd (h :: (k -> *) -> (l -> *)) :: (k -> *) -> (l -> *) + +-- | A class for applying all injections corresponding to a sum-like +-- structure to a table containing suitable arguments. +-- +class (UnProd (Prod h) ~ h) => HApInjs (h :: (k -> *) -> (l -> *)) where + + -- | For a given table (product-like structure), produce a list where + -- each element corresponds to the application of an injection function + -- into the corresponding sum-like structure. + -- + -- /Instances:/ + -- + -- @ + -- 'hapInjs', 'Generics.SOP.NS.apInjs_NP' :: 'Generics.SOP.Sing.SListI' xs => 'Generics.SOP.NP.NP' f xs -> ['Generics.SOP.NS.NS' f xs ] + -- 'hapInjs', 'Generics.SOP.NS.apInjs_SOP' :: 'SListI2' xss => 'Generics.SOP.NP.POP' f xs -> ['Generics.SOP.NS.SOP' f xss] + -- @ + -- + -- /Examples:/ + -- + -- >>> hapInjs (I 'x' :* I True :* I 2 :* Nil) + -- [Z (I 'x'), S (Z (I True)), S (S (Z (I 2)))] + -- + -- >>> hapInjs (POP ((I 'x' :* Nil) :* (I True :* I 2 :* Nil) :* Nil) + -- [SOP (Z (I 'x' :* Nil)), SOP (S (Z (I True :* (I 2 :* Nil))))] + -- + -- @since 0.2.4.0 + -- + hapInjs :: (SListIN h xs) => Prod h f xs -> [h f xs] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/generics-sop-0.2.3.0/src/Generics/SOP/Metadata.hs new/generics-sop-0.2.4.0/src/Generics/SOP/Metadata.hs --- old/generics-sop-0.2.3.0/src/Generics/SOP/Metadata.hs 2016-12-04 11:26:01.000000000 +0100 +++ new/generics-sop-0.2.4.0/src/Generics/SOP/Metadata.hs 2017-02-02 14:06:35.000000000 +0100 @@ -39,14 +39,26 @@ -- Newtype Newtype :: ModuleName -> DatatypeName -> ConstructorInfo '[x] -> DatatypeInfo '[ '[x] ] +-- | The module name where a datatype is defined. +-- +-- @since 0.2.3.0 +-- moduleName :: DatatypeInfo xss -> ModuleName moduleName (ADT name _ _) = name moduleName (Newtype name _ _) = name +-- | The name of a datatype (or newtype). +-- +-- @since 0.2.3.0 +-- datatypeName :: DatatypeInfo xss -> DatatypeName datatypeName (ADT _ name _ ) = name datatypeName (Newtype _ name _) = name +-- | The constructor info for a datatype (or newtype). +-- +-- @since 0.2.3.0 +-- constructorInfo :: DatatypeInfo xss -> NP ConstructorInfo xss constructorInfo (ADT _ _ cs) = cs constructorInfo (Newtype _ _ c) = c :* Nil @@ -67,6 +79,10 @@ -- Record constructor Record :: SListI xs => ConstructorName -> NP FieldInfo xs -> ConstructorInfo xs +-- | The name of a constructor. +-- +-- @since 0.2.3.0 +-- constructorName :: ConstructorInfo xs -> ConstructorName constructorName (Constructor name) = name constructorName (Infix name _ _) = name @@ -81,6 +97,10 @@ FieldInfo :: FieldName -> FieldInfo a deriving (Show, Eq, Ord, Functor) +-- | The name of a field. +-- +-- @since 0.2.3.0 +-- fieldName :: FieldInfo a -> FieldName fieldName (FieldInfo n) = n diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/generics-sop-0.2.3.0/src/Generics/SOP/NS.hs new/generics-sop-0.2.4.0/src/Generics/SOP/NS.hs --- old/generics-sop-0.2.3.0/src/Generics/SOP/NS.hs 2016-12-04 11:26:01.000000000 +0100 +++ new/generics-sop-0.2.4.0/src/Generics/SOP/NS.hs 2017-02-02 14:06:35.000000000 +0100 @@ -1,11 +1,14 @@ -{-# LANGUAGE PolyKinds, StandaloneDeriving, UndecidableInstances #-} +{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE PolyKinds #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-deprecations #-} -- | n-ary sums (and sums of products) module Generics.SOP.NS ( -- * Datatypes NS(..) , SOP(..) - , unZ , unSOP -- * Constructing sums , Injection @@ -14,6 +17,10 @@ , shiftInjection , apInjs_NP , apInjs_POP + -- * Destructing sums + , unZ + , index_NS + , index_SOP -- * Application , ap_NS , ap_SOP @@ -123,6 +130,31 @@ unZ (Z x) = x unZ _ = error "inaccessible" -- needed even in GHC 8.0.1 +-- | Obtain the index from an n-ary sum. +-- +-- An n-nary sum represents a choice between n different options. +-- This function returns an integer between 0 and n - 1 indicating +-- the option chosen by the given value. +-- +-- /Examples:/ +-- +-- >>> index_NS (S (S (Z (I False)))) +-- 2 +-- >>> index_NS (Z (K ())) +-- 0 +-- +-- @since 0.2.4.0 +-- +index_NS :: forall f xs . NS f xs -> Int +index_NS = go 0 + where + go :: forall ys . Int -> NS f ys -> Int + go !acc (Z _) = acc + go !acc (S x) = go (acc + 1) x + +instance HIndex NS where + hindex = index_NS + -- | A sum of products. -- -- This is a 'newtype' for an 'NS' of an 'NP'. The elements of the @@ -146,6 +178,31 @@ unSOP :: SOP f xss -> NS (NP f) xss unSOP (SOP xss) = xss +-- | Obtain the index from an n-ary sum of products. +-- +-- An n-nary sum represents a choice between n different options. +-- This function returns an integer between 0 and n - 1 indicating +-- the option chosen by the given value. +-- +-- /Specification:/ +-- +-- @ +-- 'index_SOP' = 'index_NS' '.' 'unSOP' +-- @ +-- +-- /Example:/ +-- +-- >>> index_SOP (SOP (S (Z (I True :* I 'x' :* Nil)))) +-- 1 +-- +-- @since 0.2.4.0 +-- +index_SOP :: SOP f xs -> Int +index_SOP = index_NS . unSOP + +instance HIndex SOP where + hindex = index_SOP + -- * Constructing sums -- | The type of injections into an n-ary sum. @@ -212,6 +269,15 @@ apInjs_POP :: SListI xss => POP f xss -> [SOP f xss] apInjs_POP = map SOP . apInjs_NP . unPOP +type instance UnProd NP = NS +type instance UnProd POP = SOP + +instance HApInjs NS where + hapInjs = apInjs_NP + +instance HApInjs SOP where + hapInjs = apInjs_POP + -- * Application -- | Specialization of 'hap'. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/generics-sop-0.2.3.0/src/Generics/SOP.hs new/generics-sop-0.2.4.0/src/Generics/SOP.hs --- old/generics-sop-0.2.3.0/src/Generics/SOP.hs 2016-12-04 11:26:01.000000000 +0100 +++ new/generics-sop-0.2.4.0/src/Generics/SOP.hs 2017-02-02 14:06:35.000000000 +0100 @@ -221,7 +221,6 @@ -- * n-ary datatypes , NP(..) , NS(..) - , unZ , SOP(..) , unSOP , POP(..) @@ -277,8 +276,13 @@ , injections , shift , shiftInjection - , apInjs_NP - , apInjs_POP + , UnProd + , HApInjs(..) + , apInjs_NP -- deprecated export + , apInjs_POP -- deprecated export + -- ** Destructing sums + , unZ + , HIndex(..) -- ** Dealing with @'All' c@ , hcliftA' , hcliftA2'