1 | ;
|
2 |
|
3 | var assert = require("assert");
|
4 |
|
5 | /**
|
6 | ### sum (n-ary either)
|
7 |
|
8 | See: [Wikipedia](https://en.wikipedia.org/wiki/Tagged_union)
|
9 | */
|
10 |
|
11 | function Addend(idx, len, value) {
|
12 | assert(len > 0, "Addend: 0 < len"); // empty sum is void - cannot create such
|
13 | assert(idx >= 0 && idx < len, "Addend: 0 <= idx < len");
|
14 | this.idx = idx;
|
15 | this.len = len;
|
16 | this.value = value;
|
17 | }
|
18 |
|
19 | /**
|
20 | - `sum.addend(idx: nat, n: nat, value: a): sum (... a ...)`
|
21 | */
|
22 | function addend(idx, len, value) {
|
23 | return new Addend(idx, len, value);
|
24 | }
|
25 |
|
26 | /**
|
27 | - `.fold(f: (idx: nat, n: nat, value: a) -> b): b`
|
28 | */
|
29 | Addend.prototype.fold = function (f) {
|
30 | return f(this.idx, this.len, this.value);
|
31 | };
|
32 |
|
33 | module.exports = {
|
34 | addend: addend,
|
35 | };
|