@@ -31,6 +31,7 @@ The generated 'arbitrary' method is equivalent to
32module Test.QuickCheck.Arbitrary.Generic
32module Test.QuickCheck.Arbitrary.Generic
33 ( Arbitrary(..)
33 ( Arbitrary(..)
34 , genericArbitrary
35 , genericArbitrary
35 , genericShrink
36 , genericShrink
@@ -44,16 +45,20 @@ import GHC.TypeLits
44import Test.QuickCheck as QC
45import Test.QuickCheck as QC
45import Test.QuickCheck.Arbitrary
46import Test.QuickCheck.Arbitrary
48+type family TypesDiffer a b where
49+ TypesDiffer a a = 'False
50+ TypesDiffer a b = 'True
52+type Arg self field = (TypesDiffer self field ~ 'True)
47type family AllFieldsFinal self (a :: * -> *) :: Bool where
54type family AllFieldsFinal self (a :: * -> *) :: Bool where
48 AllFieldsFinal self U1 = 'True
55 AllFieldsFinal self U1 = 'True
49 AllFieldsFinal self (a :*: b) = AllFieldsFinal self a && AllFieldsFinal self b
56 AllFieldsFinal self (a :*: b) = AllFieldsFinal self a && AllFieldsFinal self b
50− AllFieldsFinal self (M1 S t (K1 R self)) = 'False
57+ AllFieldsFinal self (M1 S t (K1 R field)) = TypesDiffer self field
51− AllFieldsFinal self (M1 S t (K1 R other)) = 'True
53type family Finite self (a :: * -> *) :: Bool where
59type family Finite self (a :: * -> *) :: Bool where
54 Finite self U1 = 'True
60 Finite self U1 = 'True
55− Finite self (K1 R self) = 'False
61+ Finite self (K1 R field) = TypesDiffer self field
56− Finite self (K1 R other) = 'True
57 Finite self (a :*: b) = Finite self a && Finite self b
62 Finite self (a :*: b) = Finite self a && Finite self b
58 Finite self (M1 D t f) = Finite self f
63 Finite self (M1 D t f) = Finite self f
59 Finite self (a :+: b) = Finite self a || Finite self b
64 Finite self (a :+: b) = Finite self a || Finite self b