UNPKG

foop

Version:

interfaces that describe their intentions.

102 lines (97 loc) 10 kB
/* eslint max-len: "OFF" */ /* eslint consistent-return: "OFF" */ var isNumberPrimitive = require('../is/numberPrimitive') var curry = require('./curry') // const nAry = require('./arity') /** * Wraps a constructor function inside a curried function that can be called * with the same arguments and returns the same type. The arity of the function * returned is specified to allow using variadic constructor functions. * * @memberOf fp * @symb 👷 * @since 5.0.0-beta.4 * * @param {number} n The arity of the constructor function. (aka, number of args) * @param {Function} Klass The constructor function to wrap. (class to do `new Klass` on) * @return {Function} A wrapped, curried constructor function. * * @func * @fork v0.4.0 * @category Function * @sig Number -> (* -> {*}) -> (* -> {*}) * * @extends R.construct * @extends R.constructN * @variation with a single *notNumber* arg, it acts as construct, rather than constructN * * {@link https://stackoverflow.com/questions/9267157/why-is-it-impossible-to-change-constructor-function-from-prototype stack-overflow-constructor} * {@link https://github.com/ramda/ramda/blob/master/src/constructN.js ramda-construct} * @see {@link ramda-construct} * @see {@link stack-overflow-constructor} * @see isNumberPrimitive * * @example * * // Variadic Constructor function * function Salad() { * this.ingredients = arguments; * } * * Salad.prototype.recipe = function() { * var instructions = R.map(ingredient => 'Add a dollop of ' + ingredient, this.ingredients); * return R.join('\n', instructions); * }; * * var ThreeLayerSalad = R.constructN(3, Salad); * * // Notice we no longer need the 'new' keyword, and the constructor is curried for 3 arguments. * var salad = ThreeLayerSalad('Mayonnaise')('Potato Chips')('Ketchup'); * * console.log(salad.recipe()); * // Add a dollop of Mayonnaise * // Add a dollop of Potato Chips * // Add a dollop of Ketchup * */ function constructN(n, Klass) { var this$1 = this; if (!isNumberPrimitive(n)) { return constructN(n.length, n) } else if (n === 0) { /** * @HACK @FIXME @TODO shows incorrect arity, * but if we want not-specific constructs... */ return function (...args) { if (args.length !== 0) { return constructN(args.length, Klass).apply(this$1, args) } else { return new Klass() } } } else { /*, $5, $6, $7, $8, $9 */ // curry(nAry(n, return curry(n, function($0, $1, $2, $3, $4) { var len = arguments.length if (len === 1 || len > 5) { return new Klass($0, $1, $2) } else if (len === 2) { return new Klass($0, $1) } else if (len === 3) { return new Klass($0, $1, $2) } else if (len === 4) { return new Klass($0, $1, $2, $3) } else if (len === 5) { return new Klass($0, $1, $2, $3, $4) } // else if (len=== 6) return new Klass($0, $1, $2, $3, $4, $5) // else if (len=== 7) return new Klass($0, $1, $2, $3, $4, $5, $6) // else if (len=== 8) return new Klass($0, $1, $2, $3, $4, $5, $6, $7) // else if (len=== 9) return new Klass($0, $1, $2, $3, $4, $5, $6, $7, $8) // else if (len === 10) return new Klass($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) }) // )) } } // module.exports = curry(2, constructN) module.exports = constructN //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0LmpzIiwic291cmNlcyI6WyJjb25zdHJ1Y3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG1heC1sZW46IFwiT0ZGXCIgKi9cbi8qIGVzbGludCBjb25zaXN0ZW50LXJldHVybjogXCJPRkZcIiAqL1xuXG5jb25zdCBpc051bWJlclByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2lzL251bWJlclByaW1pdGl2ZScpXG5jb25zdCBjdXJyeSA9IHJlcXVpcmUoJy4vY3VycnknKVxuLy8gY29uc3QgbkFyeSA9IHJlcXVpcmUoJy4vYXJpdHknKVxuXG4vKipcbiAqIFdyYXBzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gaW5zaWRlIGEgY3VycmllZCBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWRcbiAqIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSBzYW1lIHR5cGUuIFRoZSBhcml0eSBvZiB0aGUgZnVuY3Rpb25cbiAqIHJldHVybmVkIGlzIHNwZWNpZmllZCB0byBhbGxvdyB1c2luZyB2YXJpYWRpYyBjb25zdHJ1Y3RvciBmdW5jdGlvbnMuXG4gKlxuICogQG1lbWJlck9mIGZwXG4gKiBAc3ltYiDwn5G3XG4gKiBAc2luY2UgNS4wLjAtYmV0YS40XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIGFyaXR5IG9mIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4gKGFrYSwgbnVtYmVyIG9mIGFyZ3MpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBLbGFzcyBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gd3JhcC4gKGNsYXNzIHRvIGRvIGBuZXcgS2xhc3NgIG9uKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgd3JhcHBlZCwgY3VycmllZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQGZvcmsgdjAuNC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgTnVtYmVyIC0+ICgqIC0+IHsqfSkgLT4gKCogLT4geyp9KVxuICpcbiAqIEBleHRlbmRzIFIuY29uc3RydWN0XG4gKiBAZXh0ZW5kcyBSLmNvbnN0cnVjdE5cbiAqIEB2YXJpYXRpb24gd2l0aCBhIHNpbmdsZSAqbm90TnVtYmVyKiBhcmcsIGl0IGFjdHMgYXMgY29uc3RydWN0LCByYXRoZXIgdGhhbiBjb25zdHJ1Y3ROXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzkyNjcxNTcvd2h5LWlzLWl0LWltcG9zc2libGUtdG8tY2hhbmdlLWNvbnN0cnVjdG9yLWZ1bmN0aW9uLWZyb20tcHJvdG90eXBlIHN0YWNrLW92ZXJmbG93LWNvbnN0cnVjdG9yfVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9yYW1kYS9yYW1kYS9ibG9iL21hc3Rlci9zcmMvY29uc3RydWN0Ti5qcyByYW1kYS1jb25zdHJ1Y3R9XG4gKiBAc2VlIHtAbGluayByYW1kYS1jb25zdHJ1Y3R9XG4gKiBAc2VlIHtAbGluayBzdGFjay1vdmVyZmxvdy1jb25zdHJ1Y3Rvcn1cbiAqIEBzZWUgaXNOdW1iZXJQcmltaXRpdmVcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgLy8gVmFyaWFkaWMgQ29uc3RydWN0b3IgZnVuY3Rpb25cbiAqICAgICAgZnVuY3Rpb24gU2FsYWQoKSB7XG4gKiAgICAgICAgdGhpcy5pbmdyZWRpZW50cyA9IGFyZ3VtZW50cztcbiAqICAgICAgfVxuICpcbiAqICAgICAgU2FsYWQucHJvdG90eXBlLnJlY2lwZSA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgIHZhciBpbnN0cnVjdGlvbnMgPSBSLm1hcChpbmdyZWRpZW50ID0+ICdBZGQgYSBkb2xsb3Agb2YgJyArIGluZ3JlZGllbnQsIHRoaXMuaW5ncmVkaWVudHMpO1xuICogICAgICAgIHJldHVybiBSLmpvaW4oJ1xcbicsIGluc3RydWN0aW9ucyk7XG4gKiAgICAgIH07XG4gKlxuICogICAgICB2YXIgVGhyZWVMYXllclNhbGFkID0gUi5jb25zdHJ1Y3ROKDMsIFNhbGFkKTtcbiAqXG4gKiAgICAgIC8vIE5vdGljZSB3ZSBubyBsb25nZXIgbmVlZCB0aGUgJ25ldycga2V5d29yZCwgYW5kIHRoZSBjb25zdHJ1Y3RvciBpcyBjdXJyaWVkIGZvciAzIGFyZ3VtZW50cy5cbiAqICAgICAgdmFyIHNhbGFkID0gVGhyZWVMYXllclNhbGFkKCdNYXlvbm5haXNlJykoJ1BvdGF0byBDaGlwcycpKCdLZXRjaHVwJyk7XG4gKlxuICogICAgICBjb25zb2xlLmxvZyhzYWxhZC5yZWNpcGUoKSk7XG4gKiAgICAgIC8vIEFkZCBhIGRvbGxvcCBvZiBNYXlvbm5haXNlXG4gKiAgICAgIC8vIEFkZCBhIGRvbGxvcCBvZiBQb3RhdG8gQ2hpcHNcbiAqICAgICAgLy8gQWRkIGEgZG9sbG9wIG9mIEtldGNodXBcbiAqXG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdE4obiwgS2xhc3MpIHtcbiAgaWYgKCFpc051bWJlclByaW1pdGl2ZShuKSkge1xuICAgIHJldHVybiBjb25zdHJ1Y3ROKG4ubGVuZ3RoLCBuKVxuICB9XG4gIGVsc2UgaWYgKG4gPT09IDApIHtcbiAgICAvKipcbiAgICAgKiBASEFDSyBARklYTUUgQFRPRE8gc2hvd3MgaW5jb3JyZWN0IGFyaXR5LFxuICAgICAqICAgICAgICAgICAgICAgICAgICBidXQgaWYgd2Ugd2FudCBub3Qtc3BlY2lmaWMgY29uc3RydWN0cy4uLlxuICAgICAqL1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3ROKGFyZ3MubGVuZ3RoLCBLbGFzcykuYXBwbHkodGhpcywgYXJncylcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IEtsYXNzKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLyosICQ1LCAkNiwgJDcsICQ4LCAkOSAqL1xuICAgIC8vIGN1cnJ5KG5BcnkobixcbiAgICByZXR1cm4gY3VycnkobiwgZnVuY3Rpb24oJDAsICQxLCAkMiwgJDMsICQ0KSB7XG4gICAgICBjb25zdCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICBpZiAobGVuID09PSAxIHx8IGxlbiA+IDUpIHJldHVybiBuZXcgS2xhc3MoJDAsICQxLCAkMilcbiAgICAgIGVsc2UgaWYgKGxlbiA9PT0gMikgcmV0dXJuIG5ldyBLbGFzcygkMCwgJDEpXG4gICAgICBlbHNlIGlmIChsZW4gPT09IDMpIHJldHVybiBuZXcgS2xhc3MoJDAsICQxLCAkMilcbiAgICAgIGVsc2UgaWYgKGxlbiA9PT0gNCkgcmV0dXJuIG5ldyBLbGFzcygkMCwgJDEsICQyLCAkMylcbiAgICAgIGVsc2UgaWYgKGxlbiA9PT0gNSkgcmV0dXJuIG5ldyBLbGFzcygkMCwgJDEsICQyLCAkMywgJDQpXG4gICAgICAvLyBlbHNlIGlmIChsZW49PT0gNikgcmV0dXJuIG5ldyBLbGFzcygkMCwgJDEsICQyLCAkMywgJDQsICQ1KVxuICAgICAgLy8gZWxzZSBpZiAobGVuPT09IDcpIHJldHVybiBuZXcgS2xhc3MoJDAsICQxLCAkMiwgJDMsICQ0LCAkNSwgJDYpXG4gICAgICAvLyBlbHNlIGlmIChsZW49PT0gOCkgcmV0dXJuIG5ldyBLbGFzcygkMCwgJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgJDcpXG4gICAgICAvLyBlbHNlIGlmIChsZW49PT0gOSkgcmV0dXJuIG5ldyBLbGFzcygkMCwgJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgJDcsICQ4KVxuICAgICAgLy8gZWxzZSBpZiAobGVuID09PSAxMCkgcmV0dXJuIG5ldyBLbGFzcygkMCwgJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgJDcsICQ4LCAkOSlcbiAgICB9KVxuICAgIC8vICkpXG4gIH1cbn1cblxuLy8gbW9kdWxlLmV4cG9ydHMgPSBjdXJyeSgyLCBjb25zdHJ1Y3ROKVxubW9kdWxlLmV4cG9ydHMgPSBjb25zdHJ1Y3ROXG4iXSwibmFtZXMiOlsiY29uc3QiLCJ0aGlzIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0FBR0FBLEdBQUssQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUM7QUFDMURBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0RoQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7O0FBQUE7RUFDN0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ3pCLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0dBQy9CO09BQ0ksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFOzs7OztJQUtoQixPQUFPLFNBQUEsQ0FBQyxHQUFHLElBQUksRUFBRSxBQUFHO01BQ2xCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUNDLE1BQUksRUFBRSxJQUFJLENBQUM7T0FDeEQ7V0FDSTtRQUNILE9BQU8sSUFBSSxLQUFLLEVBQUU7T0FDbkI7S0FDRjtHQUNGO09BQ0k7OztJQUdILE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7TUFDM0NELEdBQUssQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU07TUFDNUIsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBQSxPQUFPLElBQUksS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUE7V0FDakQsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLEVBQUEsT0FBTyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUE7V0FDdkMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLEVBQUEsT0FBTyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFBO1dBQzNDLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFBLE9BQU8sSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUE7V0FDL0MsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLEVBQUEsT0FBTyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUE7Ozs7OztLQU16RCxDQUFDOztHQUVIO0NBQ0Y7OztBQUdELE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVTsifQ==