jsverify
Version:
Property-based testing for JavaScript.
97 lines (78 loc) • 1.92 kB
JavaScript
/* @flow weak */
;
/**
### Show functions
*/
var utils = require("./utils.js");
/**
- `show.def(x : a): string`
Currently implemented as `JSON.stringify`.
*/
function showDef(obj) {
return JSON.stringify(obj);
}
/**
- `show.pair(showA: a -> string, showB: b -> string, x: (a, b)): string`
*/
function showPair(showA, showB) {
var result = function (p) {
return "(" + showA(p[0]) + ", " + showB(p[1]) + ")";
};
return utils.curried3(result, arguments);
}
/**
- `show.either(showA: a -> string, showB: b -> string, e: either a b): string`
*/
function showEither(showA, showB) {
function showLeft(value) {
return "Left(" + showA(value) + ")";
}
function showRight(value) {
return "Right(" + showB(value) + ")";
}
var result = function (e) {
return e.either(showLeft, showRight);
};
return utils.curried3(result, arguments);
}
/**
- `show.tuple(shrinks: (a -> string, b -> string...), x: (a, b...)): string`
*/
function showTuple(shows) {
var result = function (objs) {
var strs = [];
for (var i = 0; i < shows.length; i++) {
strs.push(shows[i](objs[i]));
}
return strs.join("; ");
};
return utils.curried2(result, arguments);
}
/**
- `show.sum(shrinks: (a -> string, b -> string...), x: (a | b ...)): string`
*/
function showSum(shows) {
var result = function (sum) {
return sum.fold(function (idx, n, value) {
return "Sum(" + idx + "/" + n + ": " + shows[idx](value) + ")";
});
};
return utils.curried2(result, arguments);
}
/**
- `show.array(shrink: a -> string, x: array a): string`
*/
function showArray(show) {
var result = function (arr) {
return "[" + arr.map(show).join(", ") + "]";
};
return utils.curried2(result, arguments);
}
module.exports = {
def: showDef,
pair: showPair,
either: showEither,
tuple: showTuple,
sum: showSum,
array: showArray,
};