module Test.QuickCheck.DynamicLogic.CanGenerate (canGenerate) where
import System.IO.Unsafe
import Test.QuickCheck
canGenerate :: Double -> Gen a -> (a -> Bool) -> Bool
canGenerate :: forall a. Double -> Gen a -> (a -> Bool) -> Bool
canGenerate Double
prob Gen a
g a -> Bool
p = IO Bool -> Bool
forall a. IO a -> a
unsafePerformIO (IO Bool -> Bool) -> IO Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Double -> IO Bool
tryToGenerate Double
1
where
tryToGenerate :: Double -> IO Bool
tryToGenerate Double
luck
| Double
luck Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Double
eps = Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
| Bool
otherwise = do
a
x <- Gen a -> IO a
forall a. Gen a -> IO a
generate Gen a
g
if a -> Bool
p a
x
then Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
else Double -> IO Bool
tryToGenerate (Double
luck Double -> Double -> Double
forall a. Num a => a -> a -> a
* (Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
prob))
eps :: Double
eps = Double
1.0e-9