UNPKG

1.43 kBJavaScriptView Raw
1"use strict";
2
3var generator = require("./generator.js");
4var arbitraryBless = require("./arbitraryBless.js");
5var arbitraryAssert = require("./arbitraryAssert.js");
6var utils = require("./utils.js");
7
8/**
9 ### Small arbitraries
10
11 - `generator.small(gen: generator a): generator a`
12 - `small(arb: arbitrary a): arbitrary a`
13
14 Create a generator (abitrary) which will generate smaller values, i.e. generator's `size` parameter is decreased logarithmically.
15
16 ```js
17 jsc.property("small array of small natural numbers", "small (array nat)", function (arr) {
18 return Array.isArray(arr);
19 });
20
21 jsc.property("small array of normal natural numbers", "(small array) nat", function (arr) {
22 return Array.isArray(arr);
23 });
24 ```
25*/
26
27function smallGenerator(gen) {
28 // TODO: assertGenerator(gen)
29 return generator.bless(function (size) {
30 return gen(utils.ilog2(size));
31 });
32}
33
34function smallArbitraryImpl(arb) {
35 arbitraryAssert(arb);
36 return arbitraryBless({
37 generator: smallGenerator(arb.generator),
38 shrink: arb.shrink,
39 show: arb.show,
40 });
41}
42
43function smallArbitrary(arb) {
44 if (typeof arb === "function") {
45 return function () {
46 var resArb = arb.apply(arb, arguments);
47 return smallArbitraryImpl(resArb);
48 };
49 } else { /* if (typeof arb === "object") */
50 return smallArbitraryImpl(arb);
51 }
52}
53
54module.exports = {
55 generator: smallGenerator,
56 arbitrary: smallArbitrary,
57};