UNPKG

@dashkite/joy

Version:

*The simplicity of Lodash with the functional flair of Rambda.*

140 lines (139 loc) 18.8 kB
"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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