@@ -32,6 +32,7 @@ The generated 'arbitrary' method is equivalent to
3232module Test.QuickCheck.Arbitrary.Generic
3333 ( GenericArbitrary(..)
3434 , Arbitrary(..)
35+ , Arg
3536 , genericArbitrary
3637 , genericShrink
3738 ) where
@@ -57,16 +58,20 @@ instance
5758 arbitrary = coerce (genericArbitrary :: Gen a)
5859 shrink = coerce (genericShrink :: a -> [a])
5960
61+type family TypesDiffer a b where
62+ TypesDiffer a a = 'False
63+ TypesDiffer a b = 'True
64+
65+type Arg self field = (TypesDiffer self field ~ 'True)
66+
6067type family AllFieldsFinal self (a :: * -> *) :: Bool where
6168 AllFieldsFinal self U1 = 'True
6269 AllFieldsFinal self (a :*: b) = AllFieldsFinal self a && AllFieldsFinal self b
63− AllFieldsFinal self (M1 S t (K1 R self)) = 'False
64− AllFieldsFinal self (M1 S t (K1 R other)) = 'True
70+ AllFieldsFinal self (M1 S t (K1 R field)) = TypesDiffer self field
6571
6672type family Finite self (a :: * -> *) :: Bool where
6773 Finite self U1 = 'True
68− Finite self (K1 R self) = 'False
69− Finite self (K1 R other) = 'True
74+ Finite self (K1 R field) = TypesDiffer self field
7075 Finite self (a :*: b) = Finite self a && Finite self b
7176 Finite self (M1 D t f) = Finite self f
7277 Finite self (a :+: b) = Finite self a || Finite self b