module Test.QuickCheck.Property.Generic (
module Test.QuickCheck.Property.Common
, prop_Reflexive
, prop_Associative
, prop_Commutative
, prop_LeftIdentity
, prop_RightIdentity
, prop_Identity
, prop_GroupInverse
, prop_GenMonoid
, prop_Group
) where
import Test.QuickCheck.Property.Common
import Test.QuickCheck.Property.Common.Internal
prop_Reflexive :: (a -> a -> Bool) -> T a -> a -> Bool
prop_Reflexive f T x = f x x
prop_Commutative :: (a -> a -> b) -> T (a,b) -> a -> a -> Equal b
prop_Commutative f T x y = f x y .==. f y x
prop_Associative :: (a -> a -> a) -> T a -> a -> a -> a -> Equal a
prop_Associative (<>) T a b c = ((a <> b) <> c) .==. (a <> (b <> c))
prop_LeftIdentity :: a
-> (a -> a -> a)
-> T a -> a -> Equal a
prop_LeftIdentity e (<>) T x = (e <> x) .==. x
prop_RightIdentity :: a
-> (a -> a -> a)
-> T a -> a -> Equal a
prop_RightIdentity e (<>) T x = (x <> e) .==. x
prop_Identity :: a
-> (a -> a -> a)
-> T a -> a -> Equal a
prop_Identity = prop_LeftIdentity .&&. prop_RightIdentity
prop_GroupInverse :: a
-> (a -> a -> a)
-> (a -> a)
-> T a -> a -> Equal a
prop_GroupInverse e (<>) inv T x = ((x <> inv x) .==. e)
.&&. ((inv x <> x) .==. e)
prop_GenMonoid :: a
-> (a -> a -> a)
-> T a -> a -> a -> a -> Equal a
prop_GenMonoid e (<>) T x y z = prop_Associative (<>) T x y z
.&&. prop_Identity e (<>) T x
prop_Group :: a
-> (a -> a -> a)
-> (a -> a)
-> T a -> a -> a -> a -> Equal a
prop_Group e (<>) inv T x y z = prop_Identity e (<>) T x
.&&. prop_Associative (<>) T x y z
.&&. prop_GroupInverse e (<>) inv T x