UNPKG

jsverify

Version:

Property-based testing for JavaScript.

107 lines (84 loc) 2.1 kB
"use strict"; var assert = require("assert"); /** ### either */ function Left(value) { this.value = value; } function Right(value) { this.value = value; } /** - `either.left(value: a): either a b` */ function left(value) { return new Left(value); } /** - `either.right(value: b): either a b` */ function right(value) { return new Right(value); } /** - `either.either(l: a -> x, r: b -> x): x` */ Left.prototype.either = function lefteither(l) { return l(this.value); }; Right.prototype.either = function righteither(l, r) { return r(this.value); }; /** - `either.isEqual(other: either a b): bool` TODO: add `eq` optional parameter */ Left.prototype.isEqual = function leftIsEqual(other) { assert(other instanceof Left || other instanceof Right, "isEqual: `other` parameter should be either"); return other instanceof Left && this.value === other.value; }; Right.prototype.isEqual = function rightIsEqual(other) { assert(other instanceof Left || other instanceof Right, "isEqual: `other` parameter should be either"); return other instanceof Right && this.value === other.value; }; /** - `either.bimap(f: a -> c, g: b -> d): either c d` ```js either.bimap(compose(f, g), compose(h, i)) ≡ either.bimap(g, i).bimap(f, h); ``` */ Left.prototype.bimap = function leftBimap(f) { return new Left(f(this.value)); }; Right.prototype.bimap = function rightBimap(f, g) { return new Right(g(this.value)); }; /** - `either.first(f: a -> c): either c b` ```js either.first(f) ≡ either.bimap(f, utils.identity) ``` */ Left.prototype.first = function leftFirst(f) { return new Left(f(this.value)); }; Right.prototype.first = function rightFirst() { return this; }; /** - `either.second(g: b -> d): either a d` ```js either.second(g) === either.bimap(utils.identity, g) ``` */ Left.prototype.second = function leftSecond() { return this; }; Right.prototype.second = function rightSecond(g) { return new Right(g(this.value)); }; module.exports = { left: left, right: right, };