Skip to content

Commit 20deac0

Browse files
authored
Merge pull request #61 from purescript/such-that
Add suchThat Gen combinator
2 parents 275356b + 044e8cd commit 20deac0

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

src/Test/QuickCheck/Gen.purs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module Test.QuickCheck.Gen
88
, repeatable
99
, stateful
1010
, variant
11+
, suchThat
1112
, sized
1213
, resize
1314
, choose
@@ -88,6 +89,16 @@ stateful f = Gen $ state \s -> runGen (f s) s
8889
variant :: forall a. Seed -> Gen a -> Gen a
8990
variant n g = Gen $ state \s -> runGen g s { newSeed = n }
9091

92+
-- | Ensure that a generator only produces values that match a predicate. If
93+
-- | the predicate always returns false the generator will loop forever.
94+
suchThat :: forall a. Gen a -> (a -> Boolean) -> Gen a
95+
suchThat gen pred = tailRecM go unit
96+
where
97+
go :: Unit -> Gen (Step Unit a)
98+
go _ = do
99+
a <- gen
100+
pure if pred a then Done a else Loop unit
101+
91102
-- | Create a random generator which depends on the size parameter.
92103
sized :: forall a. (Size -> Gen a) -> Gen a
93104
sized f = stateful (\s -> f s.size)

0 commit comments

Comments
 (0)