import arity from "./arity"; import curry from "./curry"; import curry1 from "./curry1"; import curry2 from "./curry2"; // jshint maxcomplexity: false /** * Creates a curried version of a constructor function. * The resulting function does not need the use of the `new` keyword. * The constructor function can only take up to 10 arguments. * * @function * @param {function} classFn * @returns {function} */ const construct = curry1((classFn) => constructN(classFn.length, classFn)); /** * Creates a curried constructor, like `construct`, * but also takes the constructor's arity as its first argument. * * @see construct * @function * @param {number} n * @param {function} classFn * @returns {function} */ export const constructN = curry2((n, classFn) => { if (n < 0 || n > 10) { throw new Error("The n argument must be from 0 to 10, inclusive."); } if (n === 0) { return function () { return new classFn(); }; } return curry( arity(n, function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { switch (n) { case 1: return new classFn(a0); case 2: return new classFn(a0, a1); case 3: return new classFn(a0, a1, a2); case 4: return new classFn(a0, a1, a2, a3); case 5: return new classFn(a0, a1, a2, a3, a4); case 6: return new classFn(a0, a1, a2, a3, a4, a5); case 7: return new classFn(a0, a1, a2, a3, a4, a5, a6); case 8: return new classFn(a0, a1, a2, a3, a4, a5, a6, a7); case 9: return new classFn(a0, a1, a2, a3, a4, a5, a6, a7, a8); case 10: default: return new classFn(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); } }) ); }); export default construct;