This repository has been archived on 2026-03-28. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
StasisWarden-Legacy/node_modules/structural/build/lib/match.js
T

71 lines
7.3 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.match = exports.when = exports.CaseSwitch = void 0;
class Case {
constructor(type, fn) {
this.type = type;
this.fn = fn;
}
}
class CaseSwitch {
constructor(cases) {
if (cases.length === 0) {
throw new Error("must have at least one case");
}
this.cases = cases;
}
// implemented lazily because not every CaseSwitch will be used
get accept() {
if (this.memoAccept) {
return this.memoAccept;
}
const cases = this.cases;
let type = cases[0].type;
for (let i = 1; i < cases.length; i++) {
type = type.or(cases[i].type);
}
this.memoAccept = type;
return this.memoAccept;
}
run(val) {
for (let c of this.cases) {
if (c.type.guard(val)) {
return c.fn(val);
}
}
// raise a type error if none of the cases match the value.
this.accept.assert(val);
/* istanbul ignore next */ throw "unreachable";
}
/**
* Create a new CaseSwitch that also handles the specified case.
*/
when(type, fn) {
const c = new Case(type, fn);
return new CaseSwitch([...this.cases, c]);
}
}
exports.CaseSwitch = CaseSwitch;
/**
* Create a type switch that can be used with `match()`.
*/
function when(type, fn) {
const c = new Case(type, fn);
return new CaseSwitch([c]);
}
exports.when = when;
/**
* Match a value against a type switch created with `when()`.
*
* @example
* const asString = t.match(foo,
* t.when(t.array(t.str), xs => xs.join(' and '))
* .when(t.str, s => s)
* .when(t.any, x => '' + x))
*/
// export function match<I, O, Cases extends Case<I, O>>(val: I, cases: CaseSwitch<Cases>): O {
function match(val, sw) {
return sw.run(val);
}
exports.match = match;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsTUFBTSxJQUFJO0lBSVIsWUFBWSxJQUFjLEVBQUUsRUFBa0I7UUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7SUFDZCxDQUFDO0NBQ0Y7QUFRRCxNQUFhLFVBQVU7SUFJckIsWUFBWSxLQUFjO1FBQ3hCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUE7UUFDaEQsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ3BCLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsSUFBSSxNQUFNO1FBQ1IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFBO1FBQ3hCLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBO1FBQ3hCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDL0IsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQTtJQUN4QixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQW9CO1FBQ3RCLEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQ0QsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLDBCQUEwQixDQUFDLE1BQU0sYUFBYSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksQ0FBVSxJQUFjLEVBQUUsRUFBa0I7UUFDOUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQzVCLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0NBQ0Y7QUEzQ0QsZ0NBMkNDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixJQUFJLENBQVUsSUFBYyxFQUFFLEVBQWtCO0lBQzlELE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM1QixPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUM1QixDQUFDO0FBSEQsb0JBR0M7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILCtGQUErRjtBQUMvRixTQUFnQixLQUFLLENBQStCLEdBQW9CLEVBQUUsRUFBcUI7SUFDN0YsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3BCLENBQUM7QUFGRCxzQkFFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUgfSBmcm9tICcuL3R5cGUnXG5cbmNsYXNzIENhc2U8SW4sIE91dD4ge1xuICB0eXBlOiBUeXBlPEluPlxuICBmbjogKHg6IEluKSA9PiBPdXRcblxuICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlPEluPiwgZm46ICh4OiBJbikgPT4gT3V0KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZVxuICAgIHRoaXMuZm4gPSBmblxuICB9XG59XG5cbnR5cGUgSW5PZkNhc2U8VCBleHRlbmRzIENhc2U8YW55LCBhbnk+PiA9IFQgZXh0ZW5kcyBDYXNlPGluZmVyIEluLCBhbnk+ID9cbiAgSW4gOiBuZXZlclxuXG50eXBlIE91dE9mQ2FzZTxUIGV4dGVuZHMgQ2FzZTxhbnksIGFueT4+ID0gVCBleHRlbmRzIENhc2U8YW55LCBpbmZlciBPdXQ+ID9cbiAgT3V0IDogbmV2ZXJcblxuZXhwb3J0IGNsYXNzIENhc2VTd2l0Y2g8Q2FzZXMgZXh0ZW5kcyBDYXNlPGFueSwgYW55Pj4ge1xuICBjYXNlczogQ2FzZXNbXVxuICBwcml2YXRlIG1lbW9BY2NlcHQ6IFR5cGU8SW5PZkNhc2U8Q2FzZXM+PiB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNhc2VzOiBDYXNlc1tdKSB7XG4gICAgaWYgKGNhc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBjYXNlXCIpXG4gICAgfVxuICAgIHRoaXMuY2FzZXMgPSBjYXNlc1xuICB9XG5cbiAgLy8gaW1wbGVtZW50ZWQgbGF6aWx5IGJlY2F1c2Ugbm90IGV2ZXJ5IENhc2VTd2l0Y2ggd2lsbCBiZSB1c2VkXG4gIGdldCBhY2NlcHQoKTogVHlwZTxJbk9mQ2FzZTxDYXNlcz4+IHtcbiAgICBpZiAodGhpcy5tZW1vQWNjZXB0KSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vQWNjZXB0XG4gICAgfVxuICAgIGNvbnN0IGNhc2VzID0gdGhpcy5jYXNlc1xuICAgIGxldCB0eXBlID0gY2FzZXNbMF0udHlwZVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHR5cGUgPSB0eXBlLm9yKGNhc2VzW2ldLnR5cGUpXG4gICAgfVxuICAgIHRoaXMubWVtb0FjY2VwdCA9IHR5cGVcbiAgICByZXR1cm4gdGhpcy5tZW1vQWNjZXB0XG4gIH1cblxuICBydW4odmFsOiBJbk9mQ2FzZTxDYXNlcz4pOiBPdXRPZkNhc2U8Q2FzZXM+IHtcbiAgICBmb3IgKGxldCBjIG9mIHRoaXMuY2FzZXMpIHtcbiAgICAgIGlmIChjLnR5cGUuZ3VhcmQodmFsKSkge1xuICAgICAgICByZXR1cm4gYy5mbih2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyByYWlzZSBhIHR5cGUgZXJyb3IgaWYgbm9uZSBvZiB0aGUgY2FzZXMgbWF0Y2ggdGhlIHZhbHVlLlxuICAgIHRoaXMuYWNjZXB0LmFzc2VydCh2YWwpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHRocm93IFwidW5yZWFjaGFibGVcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgQ2FzZVN3aXRjaCB0aGF0IGFsc28gaGFuZGxlcyB0aGUgc3BlY2lmaWVkIGNhc2UuXG4gICAqL1xuICB3aGVuPEluLCBPdXQ+KHR5cGU6IFR5cGU8SW4+LCBmbjogKHY6IEluKSA9PiBPdXQpOiBDYXNlU3dpdGNoPENhc2VzIHwgQ2FzZTxJbiwgT3V0Pj4ge1xuICAgIGNvbnN0IGMgPSBuZXcgQ2FzZSh0eXBlLCBmbilcbiAgICByZXR1cm4gbmV3IENhc2VTd2l0Y2goWy4uLnRoaXMuY2FzZXMsIGNdKVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgdHlwZSBzd2l0Y2ggdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGBtYXRjaCgpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdoZW48SW4sIE91dD4odHlwZTogVHlwZTxJbj4sIGZuOiAodjogSW4pID0+IE91dCkge1xuICBjb25zdCBjID0gbmV3IENhc2UodHlwZSwgZm4pXG4gIHJldHVybiBuZXcgQ2FzZVN3aXRjaChbY10pXG59XG5cbi8qKlxuICogTWF0Y2ggYSB2YWx1ZSBhZ2FpbnN0IGEgdHlwZSBzd2l0Y2ggY3JlYXRlZCB3aXRoIGB3aGVuKClgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhc1N0cmluZyA9IHQubWF0Y2goZm9vLFxuICogICB0LndoZW4odC5hcnJheSh0LnN0ciksIHhzID0+IHhzLmpvaW4oJyBhbmQgJykpXG4gKiAgICAud2hlbih0LnN0ciwgICAgICAgICAgIHMgPT4gcylcbiAqICAgIC53aGVuKHQuYW55LCAgICAgICAgICAgeCA9PiAnJyArIHgpKVxuICovXG4vLyBleHBvcnQgZnVuY3Rpb24gbWF0Y2g8SSwgTywgQ2FzZXMgZXh0ZW5kcyBDYXNlPEksIE8+Pih2YWw6IEksIGNhc2VzOiBDYXNlU3dpdGNoPENhc2VzPik6IE8ge1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoPENhc2VzIGV4dGVuZHMgQ2FzZTxhbnksIGFueT4+KHZhbDogSW5PZkNhc2U8Q2FzZXM+LCBzdzogQ2FzZVN3aXRjaDxDYXNlcz4pOiBPdXRPZkNhc2U8Q2FzZXM+IHtcbiAgcmV0dXJuIHN3LnJ1bih2YWwpXG59XG4iXX0=