UNPKG

panda-generics

Version:

Generic functions (multi-argument dispatch) for JavaScript.

135 lines (108 loc) 8.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var GenericFunction, create, define, lookup, splice = [].splice; GenericFunction = class GenericFunction { static create(options = {}) { return new this(options); } constructor({ name, description, default: _default }) { this.name = name; this.description = description; this.default = _default; if (this.name == null) { this.name = "anonymous-generic"; } this.entries = []; if (this.default == null) { this.default = (...args) => { var error; error = new TypeError(`${this.name}: Invalid arguments.`); error.arguments = args; throw error; }; } } define(...terms) { var f, ref; ref = terms, [...terms] = ref, [f] = splice.call(terms, -1); return this.entries.unshift([terms, f]); } lookup(args) { var f, i, j, len, match, ref, term, terms; ref = this.entries; // go through each definition in our lookup 'table' for (j = 0, len = ref.length; j < len; j++) { [terms, f] = ref[j]; if (terms.length > args.length) { // there must be at least one argument per term // (variadic terms can consume multiple arguments, // so the converse is not true) continue; } // we can't have a match if we don't match any terms match = false; // each argument must be consumed i = 0; while (i < args.length) { if ((term = terms[i]) == null) { match = false; break; } // if the term may be variadic (indicated by taking 0 arguments) // try the term with the remaining arguments if (term.length === 0) { match = term(...args.slice(i)); break; } if (!(match = term(args[i++]))) { // otherwise, we have the default case, where we try to match // the next argument with the next term break; } } if (match) { // if we ended up with a match, just return the corresponding fn return f; } } // if exit the loop without returning a match, return the default return this.default; } dispatch(args) { var f; f = this.lookup(args); return f(...args); } }; lookup = function ({ _ }, args) { return _.lookup(args); }; define = function ({ _ }, ...args) { return _.define(...args); }; create = function (options) { var generic; generic = function (...args) { return generic._.dispatch(args); }; generic._ = GenericFunction.create(options); return generic; }; var _default2 = { create, define, lookup }; exports.default = _default2; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9kYXZpZC9yZXBvcy9wYW5kYS1nZW5lcmljcy9zcmMvaW5kZXguY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUEsZUFBQTtBQUFBLElBQUEsTUFBQTtBQUFBLElBQUEsTUFBQTtBQUFBLElBQUEsTUFBQTtBQUFBLElBQUEsTUFBQSxHQUFBLEdBQUEsTUFBQTtBQUFNLGVBQUEsR0FBTixNQUFBLGVBQUEsQ0FBQTtBQUVXLFNBQVIsTUFBUSxDQUFDLE9BQUEsR0FBRCxFQUFBLEVBQUE7V0FBa0IsSUFBQSxJQUFBLENBQUEsT0FBQSxDO0FBQWxCOztBQUVULEVBQUEsV0FBYSxDQUFDO0FBQUEsSUFBQSxJQUFBO0FBQUEsSUFBQSxXQUFBO0FBQXVCLElBQUEsT0FBQSxFQUFBO0FBQXZCLEdBQUQsRUFBQTtBQUFFLFNBQUMsSUFBRCxHQUFDLElBQUQ7QUFBTyxTQUFDLFdBQUQsR0FBQyxXQUFEO0FBQWMsU0FBQyxPQUFELEdBQUMsUUFBRDs7O0FBQ2xDLFdBQUMsSUFBRCxHQUFTLG1CQUFUOzs7QUFDQSxTQUFBLE9BQUEsR0FBVyxFQUFYOzs7QUFDQSxXQUFDLE9BQUQsR0FBWSxDQUFBLEdBQUEsSUFBQSxLQUFBO0FBQ1YsWUFBQSxLQUFBO0FBQUEsUUFBQSxLQUFBLEdBQVEsSUFBQSxTQUFBLENBQWMsR0FBRyxLQUFILElBQWQsc0JBQUEsQ0FBUjtBQUNBLFFBQUEsS0FBSyxDQUFMLFNBQUEsR0FBa0IsSUFBbEI7QUFDQSxjQUFNLEtBQU47QUFIVSxPQUFaOztBQUhXOztBQVFiLEVBQUEsTUFBUSxDQUFBLEdBQUEsS0FBQSxFQUFBO0FBQWlCLFFBQUEsQ0FBQSxFQUFBLEdBQUE7b0NBQU4sQyxJQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsS0FBQSxFQUFBLENBQUEsQ0FBQSxDO1dBQU0sS0FBQyxPQUFELENBQUEsT0FBQSxDQUFpQixDQUFBLEtBQUEsRUFBakIsQ0FBaUIsQ0FBakIsQztBQUFqQjs7QUFFUixFQUFBLE1BQVEsQ0FBQSxJQUFBLEVBQUE7QUFHTixRQUFBLENBQUEsRUFBQSxDQUFBLEVBQUEsQ0FBQSxFQUFBLEdBQUEsRUFBQSxLQUFBLEVBQUEsR0FBQSxFQUFBLElBQUEsRUFBQSxLQUFBO0FBQUEsSUFBQSxHQUFBLEdBQUEsS0FBQSxPQUFBLENBSE0sQzs7QUFHTixTQUFBLENBQUEsR0FBQSxDQUFBLEVBQUEsR0FBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLEVBQUEsQ0FBQSxHQUFBLEdBQUEsRUFBQSxDQUFBLEVBQUEsRUFBQTtBQUFJLE9BQUEsS0FBQSxFQUFBLENBQUEsSUFBQSxHQUFBLENBQUEsQ0FBQSxDQUFBOztBQUtGLFVBQVksS0FBSyxDQUFMLE1BQUEsR0FBZSxJQUFJLENBQS9CLE1BQUEsRUFBQTs7OztBQUFBO0FBQUEsT0FMRixDOzs7QUFRRSxNQUFBLEtBQUEsR0FIQSxLQUdBLENBUkYsQzs7QUFXRSxNQUFBLENBQUEsR0FBSSxDQUFKOztBQUNBLGFBQU0sQ0FBQSxHQUFJLElBQUksQ0FBZCxNQUFBLEVBQUE7QUFJRSxZQUFJLENBQUEsSUFBQSxHQUFBLEtBQUEsQ0FBQSxDQUFBLENBQUEsS0FBSixJQUFBLEVBQUE7QUFDRSxVQUFBLEtBQUEsR0FBUSxLQUFSO0FBREY7QUFBQSxTQUpGLEM7Ozs7QUFVRSxZQUFHLElBQUksQ0FBSixNQUFBLEtBQUgsQ0FBQSxFQUFBO0FBQ0UsVUFBQSxLQUFBLEdBQVEsSUFBQSxDQUFLLEdBQUEsSUFBSyxDQUFBLEtBQUwsQ0FBTCxDQUFLLENBQUwsQ0FBUjtBQURGOzs7QUFNQSxZQUFTLEVBQUUsS0FBQSxHQUFRLElBQUEsQ0FBSyxJQUFLLENBQUEsQ0FBN0IsRUFBNkIsQ0FBVixDQUFWLENBQVQsRUFBQTs7O0FBQUE7O0FBaEJGOztBQW1CQSxVQUFBLEtBQUEsRUFBQTs7QUFBQSxlQUFBLENBQUE7O0FBL0JGLEtBSE0sQzs7O1dBcUNOLEtBQUMsTztBQXJDSzs7QUF1Q1IsRUFBQSxRQUFVLENBQUEsSUFBQSxFQUFBO0FBQ1IsUUFBQSxDQUFBO0FBQUEsSUFBQSxDQUFBLEdBQUksS0FBQSxNQUFBLENBQUEsSUFBQSxDQUFKO1dBQ0EsQ0FBQSxDQUFFLEdBQUYsSUFBQSxDO0FBRlE7O0FBckRaLENBQU07O0FBeUROLE1BQUEsR0FBUyxVQUFDO0FBQUQsRUFBQTtBQUFDLENBQUQsRUFBQSxJQUFBLEVBQUE7U0FBZSxDQUFDLENBQUQsTUFBQSxDQUFBLElBQUEsQztBQUFmLENBQVQ7O0FBQ0EsTUFBQSxHQUFTLFVBQUM7QUFBRCxFQUFBO0FBQUMsQ0FBRCxFQUFBLEdBQUEsSUFBQSxFQUFBO1NBQWtCLENBQUMsQ0FBRCxNQUFBLENBQVMsR0FBVCxJQUFBLEM7QUFBbEIsQ0FBVDs7QUFDQSxNQUFBLEdBQVMsVUFBQSxPQUFBLEVBQUE7QUFDUCxNQUFBLE9BQUE7O0FBQUEsRUFBQSxPQUFBLEdBQVUsVUFBQSxHQUFBLElBQUEsRUFBQTtXQUFhLE9BQU8sQ0FBQyxDQUFSLENBQUEsUUFBQSxDQUFBLElBQUEsQztBQUFiLEdBQVY7O0FBQ0EsRUFBQSxPQUFPLENBQVAsQ0FBQSxHQUFZLGVBQWUsQ0FBZixNQUFBLENBQUEsT0FBQSxDQUFaO1NBQ0EsTztBQUhPLENBQVQ7O2dCQUtlO0FBQUEsRUFBQSxNQUFBO0FBQUEsRUFBQSxNQUFBO0FBQUEsRUFBQTtBQUFBLEMiLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBHZW5lcmljRnVuY3Rpb25cblxuICBAY3JlYXRlOiAob3B0aW9ucyA9IHt9KSAtPiBuZXcgQCBvcHRpb25zXG5cbiAgY29uc3RydWN0b3I6ICh7QG5hbWUsIEBkZXNjcmlwdGlvbiwgQGRlZmF1bHR9KSAtPlxuICAgIEBuYW1lID89IFwiYW5vbnltb3VzLWdlbmVyaWNcIlxuICAgIEBlbnRyaWVzID0gW11cbiAgICBAZGVmYXVsdCA/PSAoYXJncy4uLikgPT5cbiAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvciBcIiN7QG5hbWV9OiBJbnZhbGlkIGFyZ3VtZW50cy5cIlxuICAgICAgZXJyb3IuYXJndW1lbnRzID0gYXJnc1xuICAgICAgdGhyb3cgZXJyb3JcblxuICBkZWZpbmU6ICh0ZXJtcy4uLiwgZikgLT4gQGVudHJpZXMudW5zaGlmdCBbdGVybXMsIGZdXG5cbiAgbG9va3VwOiAoYXJncykgLT5cblxuICAgICMgZ28gdGhyb3VnaCBlYWNoIGRlZmluaXRpb24gaW4gb3VyIGxvb2t1cCAndGFibGUnXG4gICAgZm9yIFt0ZXJtcywgZl0gaW4gQGVudHJpZXNcblxuICAgICAgIyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBhcmd1bWVudCBwZXIgdGVybVxuICAgICAgIyAodmFyaWFkaWMgdGVybXMgY2FuIGNvbnN1bWUgbXVsdGlwbGUgYXJndW1lbnRzLFxuICAgICAgIyBzbyB0aGUgY29udmVyc2UgaXMgbm90IHRydWUpXG4gICAgICBjb250aW51ZSBpZiB0ZXJtcy5sZW5ndGggPiBhcmdzLmxlbmd0aFxuXG4gICAgICAjIHdlIGNhbid0IGhhdmUgYSBtYXRjaCBpZiB3ZSBkb24ndCBtYXRjaCBhbnkgdGVybXNcbiAgICAgIG1hdGNoID0gZmFsc2VcblxuICAgICAgIyBlYWNoIGFyZ3VtZW50IG11c3QgYmUgY29uc3VtZWRcbiAgICAgIGkgPSAwXG4gICAgICB3aGlsZSBpIDwgYXJncy5sZW5ndGhcblxuICAgICAgICAjIGlmIHRoZXJlJ3Mgbm8gY29ycmVzcG9uZGluZyB0ZXJtLCB3ZSBoYXZlIGxlZnRvdmVyXG4gICAgICAgICMgYXJndW1lbnRzIHdpdGggbm8gdGVybSB0byBjb25zdW1lIHRoZW0sIHNvIG1vdmUgb25cbiAgICAgICAgaWYgISh0ZXJtID0gdGVybXNbaV0pP1xuICAgICAgICAgIG1hdGNoID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgICMgaWYgdGhlIHRlcm0gbWF5IGJlIHZhcmlhZGljIChpbmRpY2F0ZWQgYnkgdGFraW5nIDAgYXJndW1lbnRzKVxuICAgICAgICAjIHRyeSB0aGUgdGVybSB3aXRoIHRoZSByZW1haW5pbmcgYXJndW1lbnRzXG4gICAgICAgIGlmIHRlcm0ubGVuZ3RoID09IDBcbiAgICAgICAgICBtYXRjaCA9IHRlcm0gYXJnc1tpLi5dLi4uXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICAjIG90aGVyd2lzZSwgd2UgaGF2ZSB0aGUgZGVmYXVsdCBjYXNlLCB3aGVyZSB3ZSB0cnkgdG8gbWF0Y2hcbiAgICAgICAgIyB0aGUgbmV4dCBhcmd1bWVudCB3aXRoIHRoZSBuZXh0IHRlcm1cbiAgICAgICAgYnJlYWsgaWYgIShtYXRjaCA9IHRlcm0gYXJnc1tpKytdKVxuXG4gICAgICAjIGlmIHdlIGVuZGVkIHVwIHdpdGggYSBtYXRjaCwganVzdCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZm5cbiAgICAgIHJldHVybiBmIGlmIG1hdGNoXG5cbiAgICAjIGlmIGV4aXQgdGhlIGxvb3Agd2l0aG91dCByZXR1cm5pbmcgYSBtYXRjaCwgcmV0dXJuIHRoZSBkZWZhdWx0XG4gICAgQGRlZmF1bHRcblxuICBkaXNwYXRjaDogKGFyZ3MpIC0+XG4gICAgZiA9IEBsb29rdXAgYXJnc1xuICAgIGYgYXJncy4uLlxuXG5sb29rdXAgPSAoe199LCBhcmdzKSAtPiBfLmxvb2t1cCBhcmdzXG5kZWZpbmUgPSAoe199LCBhcmdzLi4uKSAtPiBfLmRlZmluZSBhcmdzLi4uXG5jcmVhdGUgPSAob3B0aW9ucykgLT5cbiAgZ2VuZXJpYyA9IChhcmdzLi4uKSAtPiBnZW5lcmljLl8uZGlzcGF0Y2ggYXJnc1xuICBnZW5lcmljLl8gPSBHZW5lcmljRnVuY3Rpb24uY3JlYXRlIG9wdGlvbnNcbiAgZ2VuZXJpY1xuXG5leHBvcnQgZGVmYXVsdCB7Y3JlYXRlLCBkZWZpbmUsIGxvb2t1cH1cbiJdLCJzb3VyY2VSb290IjoiIn0= //# sourceURL=/Users/david/repos/panda-generics/src/index.coffee