diff --git a/src/Test/QuickCheck.hs b/src/Test/QuickCheck.hs index 710872e5..9a256358 100644 --- a/src/Test/QuickCheck.hs +++ b/src/Test/QuickCheck.hs @@ -128,6 +128,9 @@ module Test.QuickCheck -- * The 'Gen' monad: combinators for building random generators , Gen +#ifndef OLD_RANDOM + , QC(..) +#endif -- ** Generator combinators , choose , chooseInt diff --git a/src/Test/QuickCheck/Gen.hs b/src/Test/QuickCheck/Gen.hs index de8ce323..d0e9ae46 100644 --- a/src/Test/QuickCheck/Gen.hs +++ b/src/Test/QuickCheck/Gen.hs @@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-} +{-# LANGUAGE MultiParamTypeClasses #-} #ifndef NO_ST_MONAD {-# LANGUAGE Rank2Types #-} #endif @@ -53,6 +54,9 @@ import GHC.Stack #define WITHCALLSTACK(ty) ty #endif +#ifndef OLD_RANDOM +import System.Random.Stateful +#endif -------------------------------------------------------------------------- -- ** Generator type @@ -102,6 +106,34 @@ instance MonadFix Gen where let a = unGen (f a) r n in a +#ifndef OLD_RANDOM +-- | A monadic adapter that can be passed to stateful generators to make them +-- use @Gen@ as the generator monad. +-- +-- The stateful generator interface can be used as follows +-- > -- 1. Define a stateful generator +-- > myGen :: StatefulGen g m => g -> m (Int, String) +-- > myGen g = do +-- > l <- uniformRM (0, 5) g +-- > s <- replicateM l (uniformM g) +-- > pure (l, s) +-- > +-- > -- 2. Pass QC to the stateful generator to turn it into a QuickCheck generator +-- > myQCGen :: Gen (Int, String) +-- > myQCGen = myGen QC +data QC = QC + +instance StatefulGen QC Gen where + uniformWord32 QC = MkGen (\r _n -> runStateGen_ r uniformWord32) + uniformWord64 QC = MkGen (\r _n -> runStateGen_ r uniformWord64) +#if MIN_VERSION_random(1,3,0) + uniformByteArrayM pinned sz QC = + MkGen (\r _n -> runStateGen_ r (uniformByteArrayM pinned sz)) +#else + uniformShortByteString k QC = + MkGen (\r _n -> runStateGen_ r (uniformShortByteString k)) +#endif +#endif -------------------------------------------------------------------------- -- ** Primitive generator combinators