module Test.QuickCheck.Extras where

import Control.Monad.Reader
import Control.Monad.State
import Test.QuickCheck.Monadic

runPropertyStateT :: Monad m => PropertyM (StateT s m) a -> s -> PropertyM m (a, s)
runPropertyStateT :: forall (m :: * -> *) s a.
Monad m =>
PropertyM (StateT s m) a -> s -> PropertyM m (a, s)
runPropertyStateT PropertyM (StateT s m) a
p s
s0 = forall (m :: * -> *) a.
((a -> Gen (m Property)) -> Gen (m Property)) -> PropertyM m a
MkPropertyM forall a b. (a -> b) -> a -> b
$ \(a, s) -> Gen (m Property)
k -> do
  StateT s m Property
m <- forall (m :: * -> *) a.
PropertyM m a -> (a -> Gen (m Property)) -> Gen (m Property)
unPropertyM (do a
a <- PropertyM (StateT s m) a
p; s
s <- forall (m :: * -> *) a. Monad m => m a -> PropertyM m a
run forall s (m :: * -> *). MonadState s m => m s
get; forall (m :: * -> *) a. Monad m => a -> m a
return (a
a, s
s)) forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, s) -> Gen (m Property)
k
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT StateT s m Property
m s
s0

runPropertyReaderT :: Monad m => PropertyM (ReaderT e m) a -> e -> PropertyM m a
runPropertyReaderT :: forall (m :: * -> *) e a.
Monad m =>
PropertyM (ReaderT e m) a -> e -> PropertyM m a
runPropertyReaderT PropertyM (ReaderT e m) a
p e
e = forall (m :: * -> *) a.
((a -> Gen (m Property)) -> Gen (m Property)) -> PropertyM m a
MkPropertyM forall a b. (a -> b) -> a -> b
$ \a -> Gen (m Property)
k -> do
  ReaderT e m Property
m <- forall (m :: * -> *) a.
PropertyM m a -> (a -> Gen (m Property)) -> Gen (m Property)
unPropertyM PropertyM (ReaderT e m) a
p forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Gen (m Property)
k
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT e m Property
m e
e