UNPKG

1.26 kBJavaScriptView Raw
1/* @flow weak */
2"use strict";
3
4var environment = require("./environment.js");
5var typify = require("./typify.js");
6var utils = require("./utils.js");
7var generator = require("./generator.js");
8var shrink = require("./shrink.js");
9var arbitraryBless = require("./arbitraryBless.js");
10
11/**
12 - `suchthat(arb: arbitrary a, userenv: env?, p : a -> bool): arbitrary a`
13 Arbitrary of values that satisfy `p` predicate. It's advised that `p`'s accept rate is high.
14*/
15function suchthat(arb, userenv, predicate) {
16 var env;
17 if (arguments.length === 2) {
18 predicate = userenv;
19 env = environment;
20 } else {
21 env = utils.merge(environment, userenv);
22 }
23
24 arb = typeof arb === "string" ? typify.parseTypify(env, arb) : arb;
25 arb = utils.force(arb);
26
27 return arbitraryBless({
28 generator: generator.bless(function (size) {
29 for (var i = 0; ; i++) {
30 // if 5 tries failed, increase size
31 if (i > 5) {
32 i = 0;
33 size += 1;
34 }
35
36 var x = arb.generator(size);
37 if (predicate(x)) {
38 return x;
39 }
40 }
41 }),
42
43 shrink: shrink.bless(function (x) {
44 return arb.shrink(x).filter(predicate);
45 }),
46
47 show: arb.show,
48 });
49}
50
51module.exports = {
52 suchthat: suchthat,
53};