module Testing.QuickGenerator where
import Test.QuickCheck
import Control.Monad (replicateM, liftM2)
infixl 7 ??*
infixl 7 ?*
infixl 4 .|
infixl 3 .++
(??*) :: [a] -> (Int, Int) -> Gen [a]
xs ??* r = do
n <- choose r
vectorOf n (elements xs)
(?*) :: Gen [a] -> (Int, Int) -> Gen [a]
gs ?* r = do
n <- choose r
concat `fmap` replicateM n gs
repeatWithInter :: Gen [a] -> Gen [a] -> (Int, Int) -> Gen [a]
repeatWithInter g i r = do
n <- choose r
case n of
0 -> return []
1 -> g
_ -> (concat `fmap` replicateM (n 1) (g .++ i)) .++ g
(.|) :: Gen a -> Gen a -> Gen a
x .| y = do
v <- choose (False, True) :: Gen Bool
if v then x else y
(.++) :: Gen [a] -> Gen [a] -> Gen [a]
(.++) = liftM2 (++)
el :: [a] -> Gen [a]
el xs = (\x -> [x]) `fmap` elements xs