git.iko.soy/typeable/generic-arbitrary
on master help sign in
Merge branch 'fix-instances' into older-quickcheck
commitbcf174e89f15f8d9177ec2aaa3cb687a644e77f8 authorAleksey Uymanov <s9gf4ult@gmail.com> dateTue 3 Aug 2021, 17:36 (5 years ago) parent8cbf1360a1f9dc
3 files changed+22−4
generic-arbitrary.cabal+1 src/Test/QuickCheck/Arbitrary/Generic.hs+9−4 test/RecursiveTest.hs+12
generic-arbitrary.cabal+1
@@ -35,6 +35,7 @@ library
3535 default-language: Haskell2010
3636 default-extensions: AllowAmbiguousTypes
3737 , CPP
38+ , ConstraintKinds
3839 , DataKinds
3940 , DeriveGeneric
4041 , FlexibleContexts
src/Test/QuickCheck/Arbitrary/Generic.hs+9−4
@@ -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
test/RecursiveTest.hs+12
@@ -106,3 +106,15 @@ instance Arbitrary DeepRecursive where
106106
107107prop_deepRecursiveTotal :: DeepRecursive -> Property
108108prop_deepRecursiveTotal = total
109+
110+data P p = NoP | P p
111+ deriving (Eq, Show, Generic)
112+
113+instance (NFData p) => NFData (P p)
114+
115+instance (Arg (P p) p, Arbitrary p) => Arbitrary (P p) where
116+ arbitrary = genericArbitrary
117+ shrink = genericShrink
118+
119+prop_Ptotal :: P (P Int) -> Property
120+prop_Ptotal = total