QuickCheck-GenT 0.2.1 → 0.2.2
raw patch · 2 files changed
+84/−3 lines, 2 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- QuickCheck.GenT: GenT :: (QCGen -> Int -> m a) -> GenT m a
- QuickCheck.GenT: [unGenT] :: GenT m a -> QCGen -> Int -> m a
- QuickCheck.GenT: newtype GenT m a
- QuickCheck.GenT: var :: Integral n => n -> QCGen -> QCGen
+ QuickCheck.GenT: applyArbitrary2 :: MonadGen m => (Arbitrary a, Arbitrary b) => (a -> b -> r) -> m r
+ QuickCheck.GenT: applyArbitrary3 :: MonadGen m => (Arbitrary a, Arbitrary b, Arbitrary c) => (a -> b -> c -> r) -> m r
+ QuickCheck.GenT: applyArbitrary4 :: MonadGen m => (Arbitrary a, Arbitrary b, Arbitrary c, Arbitrary d) => (a -> b -> c -> d -> r) -> m r
+ QuickCheck.GenT: arbitrary :: Arbitrary a => Gen a
+ QuickCheck.GenT: arbitrary' :: (Arbitrary a, MonadGen m) => m a
+ QuickCheck.GenT: class Arbitrary a
+ QuickCheck.GenT: data Gen a
+ QuickCheck.GenT: data GenT m a
+ QuickCheck.GenT: getSize :: MonadGen m => m Int
+ QuickCheck.GenT: infiniteList :: (Arbitrary a, MonadGen m) => m [a]
+ QuickCheck.GenT: infiniteListOf :: MonadGen m => m a -> m [a]
+ QuickCheck.GenT: orderedList :: (Ord a, Arbitrary a, MonadGen m) => m [a]
+ QuickCheck.GenT: scale :: MonadGen m => (Int -> Int) -> m a -> m a
+ QuickCheck.GenT: shrink :: Arbitrary a => a -> [a]
+ QuickCheck.GenT: shuffle :: MonadGen m => [a] -> m [a]
+ QuickCheck.GenT: sublistOf :: MonadGen m => [a] -> m [a]
+ QuickCheck.GenT: suchThatMap :: MonadGen m => m a -> (a -> Maybe b) -> m b
+ QuickCheck.GenT: vector :: (Arbitrary a, MonadGen m) => Int -> m [a]
Files
- QuickCheck-GenT.cabal +1/−1
- src/QuickCheck/GenT.hs +83/−2
QuickCheck-GenT.cabal view
@@ -1,7 +1,7 @@ name: QuickCheck-GenT version:- 0.2.1+ 0.2.2 synopsis: A GenT monad transformer for QuickCheck library. description:
src/QuickCheck/GenT.hs view
@@ -4,9 +4,45 @@ -- Most of the code is borrowed from -- <http://haskell.1045720.n5.nabble.com/darcs-patch-GenT-monad-transformer-variant-of-Gen-QuickCheck-2-td3172136.html a mailing list discussion>. -- Therefor, credits go to Paul Johnson and Felix Martini.-module QuickCheck.GenT where+module QuickCheck.GenT+ ( GenT+ , runGenT+ , MonadGen(..)+ -- * Lifted functions+ , arbitrary'+ , oneof+ , frequency+ , elements+ , growingElements+ , getSize+ , scale+ , suchThat+ , suchThatMap+ , suchThatMaybe+ , applyArbitrary2+ , applyArbitrary3+ , applyArbitrary4+ , listOf+ , listOf1+ , vectorOf+ , vector+ , infiniteListOf+ , infiniteList+ , shuffle+ , sublistOf+ , orderedList+ -- * Re-exports+ , Arbitrary(..)+ , QC.Gen+ -- * Safe functions+ , oneofMay+ , elementsMay+ , growingElementsMay+ ) where import QuickCheck.GenT.Prelude+import Test.QuickCheck (Arbitrary(..))+import qualified Test.QuickCheck.Arbitrary as QC import qualified Test.QuickCheck.Gen as QC import qualified Test.QuickCheck.Random as QC import qualified System.Random as Random@@ -72,9 +108,44 @@ var k = (if k == k' then id else var k') . (if even k then fst else snd) . Random.split where k' = k `div` 2 - --------------------------------------------------------------------------+-- ** Lifted functions++arbitrary' :: (Arbitrary a, MonadGen m) => m a+arbitrary' = liftGen arbitrary++getSize :: MonadGen m => m Int+getSize = liftGen getSize++scale :: MonadGen m => (Int -> Int) -> m a -> m a+scale f g = sized (\n -> resize (f n) g)++applyArbitrary2 :: MonadGen m => (Arbitrary a, Arbitrary b) => (a -> b -> r) -> m r+applyArbitrary2 = liftGen . QC.applyArbitrary2++applyArbitrary3 :: MonadGen m => (Arbitrary a, Arbitrary b, Arbitrary c) => (a -> b -> c -> r) -> m r+applyArbitrary3 = liftGen . QC.applyArbitrary3++applyArbitrary4 :: MonadGen m => (Arbitrary a, Arbitrary b, Arbitrary c, Arbitrary d) => (a -> b -> c -> d -> r) -> m r+applyArbitrary4 = liftGen . QC.applyArbitrary4++infiniteListOf :: MonadGen m => m a -> m [a]+infiniteListOf = sequence . repeat++infiniteList :: (Arbitrary a, MonadGen m) => m [a]+infiniteList = infiniteListOf arbitrary'++shuffle :: MonadGen m => [a] -> m [a]+shuffle = liftGen . QC.shuffle++sublistOf :: MonadGen m => [a] -> m [a]+sublistOf = liftGen . QC.sublistOf++orderedList :: (Ord a, Arbitrary a, MonadGen m) => m [a]+orderedList = liftGen QC.orderedList++-------------------------------------------------------------------------- -- ** Common generator combinators -- | Generates a value that satisfies a predicate.@@ -85,6 +156,12 @@ Just x -> return x Nothing -> sized (\n -> resize (n+1) (gen `suchThat` p)) +-- | Generates a value for which the given function returns a 'Just', and then+-- applies the function.+suchThatMap :: MonadGen m => m a -> (a -> Maybe b) -> m b+gen `suchThatMap` f =+ fmap fromJust $ fmap f gen `suchThat` isJust+ -- | Tries to generate a value that satisfies a predicate. suchThatMaybe :: MonadGen m => m a -> (a -> Bool) -> m (Maybe a) gen `suchThatMaybe` p = sized (try 0 . max 1)@@ -110,6 +187,10 @@ -- | Generates a list of the given length. vectorOf :: MonadGen m => Int -> m a -> m [a] vectorOf k gen = sequence [ gen | _ <- [1..k] ]++-- | Generates a list of a given length.+vector :: (Arbitrary a, MonadGen m) => Int -> m [a]+vector n = vectorOf n arbitrary' -- * Partial functions