-- | Use QuickCheck generators and 'QuickCheck.Arbitrary' instances with Hedgehog. -- module Hedgehog.Gen.QuickCheck ( arbitrary , quickcheck ) where import Hedgehog import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range import qualified Test.QuickCheck as QuickCheck import qualified Test.QuickCheck.Gen as QuickCheck import qualified Test.QuickCheck.Random as QuickCheck seedQCGen :: MonadGen m => m QuickCheck.QCGen seedQCGen = QuickCheck.mkQCGen <$> fromGenT (Gen.integral_ Range.constantBounded) -- | Create a Hedgehog 'Gen' from a QuickCheck 'QuickCheck.Gen'. -- -- By default the 'Gen' created will not have any shrinking, you can use -- @Gen.@'Gen.shrink' if you have a shrink function which you would like to -- apply. -- quickcheck :: MonadGen m => QuickCheck.Gen a -> m a quickcheck (QuickCheck.MkGen gen) = Gen.sized $ \size -> do qcg <- seedQCGen pure $ gen qcg (fromIntegral size) -- | Create a Hedgehog 'Gen' from a QuickCheck 'QuickCheck.Arbitrary' instance. -- -- The Arbitrary's 'QuickCheck.shrink' function is used to provide shrinking -- for the Hedgehog 'Gen'. -- arbitrary :: (QuickCheck.Arbitrary a, MonadGen m) => m a arbitrary = Gen.shrink QuickCheck.shrink $ quickcheck QuickCheck.arbitrary