packages feed

quickcheck-extras-0.1: src/library/QuickCheckExtras/Gen.hs

module QuickCheckExtras.Gen where

import Data.Function
import qualified Data.Set as Set
import qualified QuickCheckExtras.Random
import Test.QuickCheck
import Test.QuickCheck.Gen
import qualified Test.QuickCheck.Random as Random
import Prelude hiding (filter)

-- * Execution

-- | Execute the QuickCheck generator deterministically.
run ::
  Gen a ->
  -- | Size.
  Int ->
  -- | Seed.
  Int ->
  a
run gen size seed = unGen gen (Random.mkQCGen seed) size

-- * Combinators

filter :: (a -> Bool) -> Gen a -> Gen a
filter = flip suchThat

setOfSize :: (Ord a) => Int -> Gen a -> Gen (Set.Set a)
setOfSize n elementGen = go Set.empty 0
  where
    go !currentSet !size
      | size >= n = pure currentSet
      | otherwise = do
          newElement <- suchThat elementGen \element -> Set.notMember element currentSet
          go (Set.insert newElement currentSet) (succ size)

-- | Get the current seed from the underlying generator.
getSeed :: Gen Int
getSeed =
  MkGen \rnd _size ->
    QuickCheckExtras.Random.toSeed rnd