@dashkite/joy
Version:
*The simplicity of Lodash with the functional flair of Rambda.*
140 lines (139 loc) • 18.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: Object.getOwnPropertyDescriptor(all, name).get
});
}
_export(exports, {
get Generic () {
return Generic;
},
get generic () {
return generic;
}
});
const _type = require("./type");
var Generic, GenericFunction, create, define, generic, isGeneric, lookup, splice = [].splice;
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 (0, _type.isFunction)(f) && f._ != null && (0, _type.isKind)(GenericFunction, f._);
};
generic = create({
name: "generic",
description: "Create or extend a generic function."
});
define(generic, create);
define(generic, _type.isObject, create);
define(generic, _type.isString, _type.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
};
//# 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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