panda-generics
Version:
Generic functions (multi-argument dispatch) for JavaScript.
135 lines (108 loc) • 8.66 kB
JavaScript
;
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