import Trivial import Identity import Two import Test.QuickCheck import Bool import Or import Combine import Data.Semigroup import Comp import Validation semigroupAssoc :: (Eq m, Semigroup m) => m -> m -> m -> Bool semigroupAssoc a b c = (a <> (b <> c)) == ((a <> b) <> c) type TrivAssoc = Trivial -> Trivial -> Trivial -> Bool type TwoType = Two Trivial Trivial type ThreeType = Three Trivial Trivial Trivial type FourType = Four Trivial Trivial Trivial Trivial type CombineType = Combine Int (Sum Int) semigroupCombineAssoc :: CombineType -> CombineType -> CombineType -> Bool semigroupCombineAssoc a b c = ((unCombine (a <> (b <> c))) 8) == ((unCombine ((a <> b) <> c)) 8) semigroupCompAssoc :: Comp (Sum Int) -> Comp (Sum Int) -> Comp (Sum Int) -> Bool semigroupCompAssoc a b c = ((unComp (a <> (b <> c))) (Sum 8)) == ((unComp ((a <> b) <> c)) (Sum 8)) monoidLeftIdentity :: (Eq m, Monoid m) => m -> Bool monoidLeftIdentity a = (mappend mempty a) == a monoidRightIdentity :: (Eq m, Monoid m) => m -> Bool monoidRightIdentity a = (mappend a mempty) == a main :: IO () main = do quickCheck (semigroupAssoc :: TrivAssoc) quickCheck (monoidLeftIdentity :: Trivial -> Bool) quickCheck (monoidRightIdentity :: Trivial -> Bool) quickCheck (semigroupAssoc :: Identity Trivial -> Identity Trivial -> Identity Trivial -> Bool) quickCheck (monoidLeftIdentity :: Identity (Sum Int)-> Bool) quickCheck (monoidRightIdentity :: Identity (Sum Int) -> Bool) quickCheck (semigroupAssoc :: TwoType -> TwoType -> TwoType -> Bool) quickCheck (monoidLeftIdentity :: TwoType -> Bool) quickCheck (monoidRightIdentity :: TwoType -> Bool) quickCheck (semigroupAssoc :: ThreeType -> ThreeType -> ThreeType -> Bool) quickCheck (monoidLeftIdentity :: ThreeType -> Bool) quickCheck (monoidRightIdentity :: ThreeType -> Bool) quickCheck (semigroupAssoc :: FourType -> FourType -> FourType -> Bool) quickCheck (monoidLeftIdentity :: FourType -> Bool) quickCheck (monoidRightIdentity :: FourType -> Bool) quickCheck (semigroupAssoc :: BoolConj -> BoolConj -> BoolConj -> Bool) quickCheck (monoidLeftIdentity :: BoolConj -> Bool) quickCheck (monoidRightIdentity :: BoolConj -> Bool) quickCheck (semigroupAssoc :: BoolDisj -> BoolDisj -> BoolDisj -> Bool) quickCheck (monoidLeftIdentity :: BoolDisj -> Bool) quickCheck (monoidRightIdentity :: BoolDisj -> Bool) quickCheck (semigroupAssoc :: Or Trivial Trivial -> Or Trivial Trivial -> Or Trivial Trivial -> Bool) quickCheck semigroupCombineAssoc quickCheck semigroupCompAssoc quickCheck (semigroupAssoc :: Validation String Int -> Validation String Int -> Validation String Int -> Bool)