quickcheck-dynamic-1.0.0: src/Test/QuickCheck/DynamicLogic/CanGenerate.hs
module Test.QuickCheck.DynamicLogic.CanGenerate (canGenerate) where
import System.IO.Unsafe
import Test.QuickCheck
-- | @canGenerate prob g p@
-- returns @False@ if we are sure @Prob(g generates x satisfying p) >= prob@
-- otherwise @True@ (and we know such an x can be generated).
canGenerate :: Double -> Gen a -> (a -> Bool) -> Bool
canGenerate prob g p = unsafePerformIO $ tryToGenerate 1
where
tryToGenerate luck
| luck < eps = return False
| otherwise = do
x <- generate g
if p x
then return True
else tryToGenerate (luck * (1 - prob))
-- Our confidence level is 1-eps
eps = 1.0e-9