module Main (main) where import Control.Applicative (liftA2) import Data.Function.Step (SF, (!)) import Test.QuickCheck (quickCheck) import Test.QuickCheck.Arbitrary (Arbitrary (..)) import Test.QuickCheck.Property (Property, counterexample, (===)) merge :: Ord x => (a -> b -> c) -> SF x a -> SF x b -> SF x c merge = liftA2 mergeProp :: (Eq c, Ord x, Show c,Show x) => (a -> b -> c) -> x -> SF x a -> SF x b -> Property mergeProp f x sf1 sf2 = counterexample ("merged: " ++ show merged) $ merged ! x === f (sf1 ! x) (sf2 ! x) where merged = merge f sf1 sf2 main :: IO () main = do -- "merge: Int addition" quickCheck (mergeProp (+) :: Int -> SF Int Int -> SF Int Int -> Property) -- "merge: Int subtraction" quickCheck (mergeProp (-) :: Int -> SF Int Int -> SF Int Int -> Property) -- "merge: Int multiplication" quickCheck (mergeProp (*) :: Int -> SF Int Int -> SF Int Int -> Property) -- "merge: Bool logical or" quickCheck (mergeProp (||) :: Bool -> SF Bool Bool -> SF Bool Bool -> Property) -- "merge: Bool logical and" quickCheck (mergeProp (&&) :: Bool -> SF Bool Bool -> SF Bool Bool -> Property) -- "merge: Double addition" quickCheck (mergeProp (+) :: Double -> SF Double Double -> SF Double Double -> Property) -- "merge: Double subtraction" quickCheck (mergeProp (-) :: Double -> SF Double Double -> SF Double Double -> Property) -- "merge: Double multiplication" quickCheck (mergeProp (*) :: Double -> SF Double Double -> SF Double Double -> Property)