UNPKG

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