@dashkite/joy
Version:
[](https://firstdonoharm.dev/version/3/0/core.html)
122 lines (121 loc) • 18.4 kB
JavaScript
var Generic, GenericFunction, create, define, generic, isGeneric, lookup, splice = [].splice;
import { isKind, isFunction, isString, isObject } from "./type";
GenericFunction = class GenericFunction {
static create(options = {}) {
return new this(options);
}
constructor({ name: name1, description: description1, default: _default }){
this.name = name1;
this.description = description1;
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);
this.entries.unshift([
terms,
f
]);
return this;
}
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) {
continue;
}
if (terms.length === 0 && args.length === 0) {
// allow for the nullary function
return f;
}
// 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)
// and this is the last available term
// try the term with the remaining arguments
if (terms.length === i + 1 && term.length === 0) {
match = term(...args.slice(i));
break;
}
if (!(match = term(args[i++]))) {
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 f;
f = function(...args) {
return f._.dispatch(args);
};
f._ = GenericFunction.create(options);
return f;
};
isGeneric = function(f) {
return isFunction(f) && f._ != null && isKind(GenericFunction, f._);
};
generic = create({
name: "generic",
description: "Create or extend a generic function."
});
define(generic, create);
define(generic, isObject, create);
define(generic, isString, isObject, function(name, description) {
return create({
...description,
name
});
});
define(generic, isGeneric, function() {
return true;
}, function(f, ...ax) {
return define(f, ...ax);
});
Generic = {
create,
define,
lookup
};
export { Generic, generic }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL0BkYXNoa2l0ZS9qb3kvc3JjL2dlbmVyaWMuY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLElBQUEsT0FBQSxFQUFBLGVBQUEsRUFBQSxNQUFBLEVBQUEsTUFBQSxFQUFBLE9BQUEsRUFBQSxTQUFBLEVBQUEsTUFBQTtFQUFBOztBQUFBLE9BQUE7RUFDRSxNQURGO0VBRUUsVUFGRjtFQUdFLFFBSEY7RUFJRSxRQUpGO0NBQUEsTUFBQTs7QUFPTSxrQkFBTixNQUFBLGdCQUFBO0VBRVcsT0FBUixNQUFRLENBQUMsVUFBVSxDQUFBLENBQVgsQ0FBQTtXQUFrQixJQUFJLElBQUosQ0FBTSxPQUFOO0VBQWxCOztFQUVULFdBQWEsQ0FBQztNQUFFLFdBQUY7TUFBUyx5QkFBVDtNQUF1QjtJQUF2QixDQUFELENBQUE7SUFBRSxJQUFDLENBQUE7SUFBTSxJQUFDLENBQUE7SUFBYSxJQUFDLENBQUE7O01BQ25DLElBQUMsQ0FBQSxPQUFROztJQUNULElBQUMsQ0FBQSxPQUFELEdBQVc7O01BQ1gsSUFBQyxDQUFBLFVBQVcsQ0FBQSxHQUFDLElBQUQsQ0FBQSxHQUFBO0FBQ2hCLFlBQUE7UUFBTSxLQUFBLEdBQVEsSUFBSSxTQUFKLENBQWMsQ0FBQSxDQUFBLENBQUcsSUFBQyxDQUFBLElBQUosQ0FBQSxvQkFBQSxDQUFkO1FBQ1IsS0FBSyxDQUFDLFNBQU4sR0FBa0I7UUFDbEIsTUFBTTtNQUhJOztFQUhEOztFQVFiLE1BQVEsQ0FBQSxHQUFDLEtBQUQsQ0FBQTtBQUFnQixRQUFBLENBQUEsRUFBQTtvQ0FBTDtJQUFNLElBQUMsQ0FBQSxPQUFPLENBQUMsT0FBVCxDQUFpQixDQUFDLEtBQUQsRUFBUSxDQUFSLENBQWpCO1dBQThCO0VBQS9DOztFQUVSLE1BQVEsQ0FBQyxJQUFELENBQUE7QUFFVixRQUFBLENBQUEsRUFBQSxDQUFBLEVBQUEsQ0FBQSxFQUFBLEdBQUEsRUFBQSxLQUFBLEVBQUEsR0FB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O0FBRVYsT0FBQTtFQUFRLE9BQVI7RUFBaUIsT0FBakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBpc0tpbmRcbiAgaXNGdW5jdGlvblxuICBpc1N0cmluZ1xuICBpc09iamVjdFxufSBmcm9tIFwiLi90eXBlXCJcblxuY2xhc3MgR2VuZXJpY0Z1bmN0aW9uXG5cbiAgQGNyZWF0ZTogKG9wdGlvbnMgPSB7fSkgLT4gbmV3IEAgb3B0aW9uc1xuXG4gIGNvbnN0cnVjdG9yOiAoe0BuYW1lLCBAZGVzY3JpcHRpb24sIEBkZWZhdWx0fSkgLT5cbiAgICBAbmFtZSA/PSBcImFub255bW91cy1nZW5lcmljXCJcbiAgICBAZW50cmllcyA9IFtdXG4gICAgQGRlZmF1bHQgPz0gKGFyZ3MuLi4pID0+XG4gICAgICBlcnJvciA9IG5ldyBUeXBlRXJyb3IgXCIje0BuYW1lfTogaW52YWxpZCBhcmd1bWVudHMuXCJcbiAgICAgIGVycm9yLmFyZ3VtZW50cyA9IGFyZ3NcbiAgICAgIHRocm93IGVycm9yXG5cbiAgZGVmaW5lOiAodGVybXMuLi4sIGYpIC0+IEBlbnRyaWVzLnVuc2hpZnQgW3Rlcm1zLCBmXSA7IEBcblxuICBsb29rdXA6IChhcmdzKSAtPlxuXG4gICAgIyBnbyB0aHJvdWdoIGVhY2ggZGVmaW5pdGlvbiBpbiBvdXIgbG9va3VwICd0YWJsZSdcbiAgICBmb3IgW3Rlcm1zLCBmXSBpbiBAZW50cmllc1xuXG4gICAgICAjIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50IHBlciB0ZXJtXG4gICAgICAjICh2YXJpYWRpYyB0ZXJtcyBjYW4gY29uc3VtZSBtdWx0aXBsZSBhcmd1bWVudHMsXG4gICAgICAjIHNvIHRoZSBjb252ZXJzZSBpcyBub3QgdHJ1ZSlcbiAgICAgIGNvbnRpbnVlIGlmIHRlcm1zLmxlbmd0aCA+IGFyZ3MubGVuZ3RoXG5cbiAgICAgICMgYWxsb3cgZm9yIHRoZSBudWxsYXJ5IGZ1bmN0aW9uXG4gICAgICByZXR1cm4gZiBpZiB0ZXJtcy5sZW5ndGggPT0gMCAmJiBhcmdzLmxlbmd0aCA9PSAwXG5cbiAgICAgICMgd2UgY2FuJ3QgaGF2ZSBhIG1hdGNoIGlmIHdlIGRvbid0IG1hdGNoIGFueSB0ZXJtc1xuICAgICAgbWF0Y2ggPSBmYWxzZVxuXG4gICAgICAjIGVhY2ggYXJndW1lbnQgbXVzdCBiZSBjb25zdW1lZFxuICAgICAgaSA9IDBcbiAgICAgIHdoaWxlIGkgPCBhcmdzLmxlbmd0aFxuXG4gICAgICAgICMgaWYgdGhlcmUncyBubyBjb3JyZXNwb25kaW5nIHRlcm0sIHdlIGhhdmUgbGVmdG92ZXJcbiAgICAgICAgIyBhcmd1bWVudHMgd2l0aCBubyB0ZXJtIHRvIGNvbnN1bWUgdGhlbSwgc28gbW92ZSBvblxuICAgICAgICBpZiAhKHRlcm0gPSB0ZXJtc1tpXSk/XG4gICAgICAgICAgbWF0Y2ggPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgIyBpZiB0aGUgdGVybSBtYXkgYmUgdmFyaWFkaWMgKGluZGljYXRlZCBieSB0YWtpbmcgMCBhcmd1bWVudHMpXG4gICAgICAgICMgYW5kIHRoaXMgaXMgdGhlIGxhc3QgYXZhaWxhYmxlIHRlcm1cbiAgICAgICAgIyB0cnkgdGhlIHRlcm0gd2l0aCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50c1xuICAgICAgICBpZiAodGVybXMubGVuZ3RoID09IGkgKyAxKSAmJiB0ZXJtLmxlbmd0aCA9PSAwXG4gICAgICAgICAgbWF0Y2ggPSB0ZXJtIGFyZ3NbaS4uXS4uLlxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgIyBvdGhlcndpc2UsIHdlIGhhdmUgdGhlIGRlZmF1bHQgY2FzZSwgd2hlcmUgd2UgdHJ5IHRvIG1hdGNoXG4gICAgICAgICMgdGhlIG5leHQgYXJndW1lbnQgd2l0aCB0aGUgbmV4dCB0ZXJtXG4gICAgICAgIGJyZWFrIGlmICEobWF0Y2ggPSB0ZXJtIGFyZ3NbaSsrXSlcblxuICAgICAgIyBpZiB3ZSBlbmRlZCB1cCB3aXRoIGEgbWF0Y2gsIGp1c3QgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGZuXG4gICAgICByZXR1cm4gZiBpZiBtYXRjaFxuXG4gICAgIyBpZiBleGl0IHRoZSBsb29wIHdpdGhvdXQgcmV0dXJuaW5nIGEgbWF0Y2gsIHJldHVybiB0aGUgZGVmYXVsdFxuICAgIEBkZWZhdWx0XG5cbiAgZGlzcGF0Y2g6IChhcmdzKSAtPlxuICAgIGYgPSBAbG9va3VwIGFyZ3NcbiAgICBmIGFyZ3MuLi5cblxubG9va3VwID0gKHtffSwgYXJncykgLT4gXy5sb29rdXAgYXJnc1xuZGVmaW5lID0gKHtffSwgYXJncy4uLikgLT4gXy5kZWZpbmUgYXJncy4uLlxuY3JlYXRlID0gKG9wdGlvbnMpIC0+XG4gIGYgPSAoYXJncy4uLikgLT4gZi5fLmRpc3BhdGNoIGFyZ3NcbiAgZi5fID0gR2VuZXJpY0Z1bmN0aW9uLmNyZWF0ZSBvcHRpb25zXG4gIGZcblxuaXNHZW5lcmljID0gKGYpIC0+XG4gIChpc0Z1bmN0aW9uIGYpICYmIChmLl8/KSAmJiAoaXNLaW5kIEdlbmVyaWNGdW5jdGlvbiwgZi5fKVxuXG5nZW5lcmljID0gY3JlYXRlXG4gIG5hbWU6IFwiZ2VuZXJpY1wiXG4gIGRlc2NyaXB0aW9uOiBcIkNyZWF0ZSBvciBleHRlbmQgYSBnZW5lcmljIGZ1bmN0aW9uLlwiXG5cbmRlZmluZSBnZW5lcmljLCBjcmVhdGVcblxuZGVmaW5lIGdlbmVyaWMsIGlzT2JqZWN0LCBjcmVhdGVcblxuZGVmaW5lIGdlbmVyaWMsIGlzU3RyaW5nLCBpc09iamVjdCwgKG5hbWUsIGRlc2NyaXB0aW9uKSAtPlxuICBjcmVhdGUge2Rlc2NyaXB0aW9uLi4uLCBuYW1lfVxuXG5kZWZpbmUgZ2VuZXJpYywgaXNHZW5lcmljLCAoLT4gdHJ1ZSksIChmLCBheC4uLikgLT4gZGVmaW5lIGYsIGF4Li4uXG5cbkdlbmVyaWMgPSB7Y3JlYXRlLCBkZWZpbmUsIGxvb2t1cH1cblxuZXhwb3J0IHtHZW5lcmljLCBnZW5lcmljfVxuIl19
//# sourceURL=/@dashkite/joy/src/generic.coffee
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlcyI6WyIvQGRhc2hraXRlL2pveS9zcmMvZ2VuZXJpYy5jb2ZmZWUiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGlzS2luZFxuICBpc0Z1bmN0aW9uXG4gIGlzU3RyaW5nXG4gIGlzT2JqZWN0XG59IGZyb20gXCIuL3R5cGVcIlxuXG5jbGFzcyBHZW5lcmljRnVuY3Rpb25cblxuICBAY3JlYXRlOiAob3B0aW9ucyA9IHt9KSAtPiBuZXcgQCBvcHRpb25zXG5cbiAgY29uc3RydWN0b3I6ICh7QG5hbWUsIEBkZXNjcmlwdGlvbiwgQGRlZmF1bHR9KSAtPlxuICAgIEBuYW1lID89IFwiYW5vbnltb3VzLWdlbmVyaWNcIlxuICAgIEBlbnRyaWVzID0gW11cbiAgICBAZGVmYXVsdCA/PSAoYXJncy4uLikgPT5cbiAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvciBcIiN7QG5hbWV9OiBpbnZhbGlkIGFyZ3VtZW50cy5cIlxuICAgICAgZXJyb3IuYXJndW1lbnRzID0gYXJnc1xuICAgICAgdGhyb3cgZXJyb3JcblxuICBkZWZpbmU6ICh0ZXJtcy4uLiwgZikgLT4gQGVudHJpZXMudW5zaGlmdCBbdGVybXMsIGZdIDsgQFxuXG4gIGxvb2t1cDogKGFyZ3MpIC0+XG5cbiAgICAjIGdvIHRocm91Z2ggZWFjaCBkZWZpbml0aW9uIGluIG91ciBsb29rdXAgJ3RhYmxlJ1xuICAgIGZvciBbdGVybXMsIGZdIGluIEBlbnRyaWVzXG5cbiAgICAgICMgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYXJndW1lbnQgcGVyIHRlcm1cbiAgICAgICMgKHZhcmlhZGljIHRlcm1zIGNhbiBjb25zdW1lIG11bHRpcGxlIGFyZ3VtZW50cyxcbiAgICAgICMgc28gdGhlIGNvbnZlcnNlIGlzIG5vdCB0cnVlKVxuICAgICAgY29udGludWUgaWYgdGVybXMubGVuZ3RoID4gYXJncy5sZW5ndGhcblxuICAgICAgIyBhbGxvdyBmb3IgdGhlIG51bGxhcnkgZnVuY3Rpb25cbiAgICAgIHJldHVybiBmIGlmIHRlcm1zLmxlbmd0aCA9PSAwICYmIGFyZ3MubGVuZ3RoID09IDBcblxuICAgICAgIyB3ZSBjYW4ndCBoYXZlIGEgbWF0Y2ggaWYgd2UgZG9uJ3QgbWF0Y2ggYW55IHRlcm1zXG4gICAgICBtYXRjaCA9IGZhbHNlXG5cbiAgICAgICMgZWFjaCBhcmd1bWVudCBtdXN0IGJlIGNvbnN1bWVkXG4gICAgICBpID0gMFxuICAgICAgd2hpbGUgaSA8IGFyZ3MubGVuZ3RoXG5cbiAgICAgICAgIyBpZiB0aGVyZSdzIG5vIGNvcnJlc3BvbmRpbmcgdGVybSwgd2UgaGF2ZSBsZWZ0b3ZlclxuICAgICAgICAjIGFyZ3VtZW50cyB3aXRoIG5vIHRlcm0gdG8gY29uc3VtZSB0aGVtLCBzbyBtb3ZlIG9uXG4gICAgICAgIGlmICEodGVybSA9IHRlcm1zW2ldKT9cbiAgICAgICAgICBtYXRjaCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICAjIGlmIHRoZSB0ZXJtIG1heSBiZSB2YXJpYWRpYyAoaW5kaWNhdGVkIGJ5IHRha2luZyAwIGFyZ3VtZW50cylcbiAgICAgICAgIyBhbmQgdGhpcyBpcyB0aGUgbGFzdCBhdmFpbGFibGUgdGVybVxuICAgICAgICAjIHRyeSB0aGUgdGVybSB3aXRoIHRoZSByZW1haW5pbmcgYXJndW1lbnRzXG4gICAgICAgIGlmICh0ZXJtcy5sZW5ndGggPT0gaSArIDEpICYmIHRlcm0ubGVuZ3RoID09IDBcbiAgICAgICAgICBtYXRjaCA9IHRlcm0gYXJnc1tpLi5dLi4uXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICAjIG90aGVyd2lzZSwgd2UgaGF2ZSB0aGUgZGVmYXVsdCBjYXNlLCB3aGVyZSB3ZSB0cnkgdG8gbWF0Y2hcbiAgICAgICAgIyB0aGUgbmV4dCBhcmd1bWVudCB3aXRoIHRoZSBuZXh0IHRlcm1cbiAgICAgICAgYnJlYWsgaWYgIShtYXRjaCA9IHRlcm0gYXJnc1tpKytdKVxuXG4gICAgICAjIGlmIHdlIGVuZGVkIHVwIHdpdGggYSBtYXRjaCwganVzdCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZm5cbiAgICAgIHJldHVybiBmIGlmIG1hdGNoXG5cbiAgICAjIGlmIGV4aXQgdGhlIGxvb3Agd2l0aG91dCByZXR1cm5pbmcgYSBtYXRjaCwgcmV0dXJuIHRoZSBkZWZhdWx0XG4gICAgQGRlZmF1bHRcblxuICBkaXNwYXRjaDogKGFyZ3MpIC0+XG4gICAgZiA9IEBsb29rdXAgYXJnc1xuICAgIGYgYXJncy4uLlxuXG5sb29rdXAgPSAoe199LCBhcmdzKSAtPiBfLmxvb2t1cCBhcmdzXG5kZWZpbmUgPSAoe199LCBhcmdzLi4uKSAtPiBfLmRlZmluZSBhcmdzLi4uXG5jcmVhdGUgPSAob3B0aW9ucykgLT5cbiAgZiA9IChhcmdzLi4uKSAtPiBmLl8uZGlzcGF0Y2ggYXJnc1xuICBmLl8gPSBHZW5lcmljRnVuY3Rpb24uY3JlYXRlIG9wdGlvbnNcbiAgZlxuXG5pc0dlbmVyaWMgPSAoZikgLT5cbiAgKGlzRnVuY3Rpb24gZikgJiYgKGYuXz8pICYmIChpc0tpbmQgR2VuZXJpY0Z1bmN0aW9uLCBmLl8pXG5cbmdlbmVyaWMgPSBjcmVhdGVcbiAgbmFtZTogXCJnZW5lcmljXCJcbiAgZGVzY3JpcHRpb246IFwiQ3JlYXRlIG9yIGV4dGVuZCBhIGdlbmVyaWMgZnVuY3Rpb24uXCJcblxuZGVmaW5lIGdlbmVyaWMsIGNyZWF0ZVxuXG5kZWZpbmUgZ2VuZXJpYywgaXNPYmplY3QsIGNyZWF0ZVxuXG5kZWZpbmUgZ2VuZXJpYywgaXNTdHJpbmcsIGlzT2JqZWN0LCAobmFtZSwgZGVzY3JpcHRpb24pIC0+XG4gIGNyZWF0ZSB7ZGVzY3JpcHRpb24uLi4sIG5hbWV9XG5cbmRlZmluZSBnZW5lcmljLCBpc0dlbmVyaWMsICgtPiB0cnVlKSwgKGYsIGF4Li4uKSAtPiBkZWZpbmUgZiwgYXguLi5cblxuR2VuZXJpYyA9IHtjcmVhdGUsIGRlZmluZSwgbG9va3VwfVxuXG5leHBvcnQge0dlbmVyaWMsIGdlbmVy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