@@ -31,6 +31,7 @@ The generated 'arbitrary' method is equivalent to
3131
3232module Test.QuickCheck.Arbitrary.Generic
3333 ( Arbitrary(..)
34+ , Arg
3435 , genericArbitrary
3536 , genericShrink
3637 ) where
@@ -44,16 +45,20 @@ import GHC.TypeLits
4445import Test.QuickCheck as QC
4546import Test.QuickCheck.Arbitrary
4647
48+type family TypesDiffer a b where
49+ TypesDiffer a a = 'False
50+ TypesDiffer a b = 'True
51+
52+type Arg self field = (TypesDiffer self field ~ 'True)
53+
4754type family AllFieldsFinal self (a :: * -> *) :: Bool where
4855 AllFieldsFinal self U1 = 'True
4956 AllFieldsFinal self (a :*: b) = AllFieldsFinal self a && AllFieldsFinal self b
50− AllFieldsFinal self (M1 S t (K1 R self)) = 'False
51− AllFieldsFinal self (M1 S t (K1 R other)) = 'True
57+ AllFieldsFinal self (M1 S t (K1 R field)) = TypesDiffer self field
5258
5359type family Finite self (a :: * -> *) :: Bool where
5460 Finite self U1 = 'True
55− Finite self (K1 R self) = 'False
56− Finite self (K1 R other) = 'True
61+ Finite self (K1 R field) = TypesDiffer self field
5762 Finite self (a :*: b) = Finite self a && Finite self b
5863 Finite self (M1 D t f) = Finite self f
5964 Finite self (a :+: b) = Finite self a || Finite self b