123 lines
4.4 KiB
JavaScript
123 lines
4.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.curry4 = exports.curry3 = exports.curry2 = exports.curry1 = exports._ = void 0;
|
|
/* eslint no-shadow:0, no-param-reassign:0 prefer-rest-params:0 */
|
|
exports._ = '@@updeep/placeholder';
|
|
function countArguments(args, max) {
|
|
let n = args.length;
|
|
if (n > max)
|
|
n = max;
|
|
while (args[n - 1] === exports._) {
|
|
n -= 1;
|
|
}
|
|
return n;
|
|
}
|
|
function curry1(fn) {
|
|
return function curried(a, ...args) {
|
|
const [b, c] = args;
|
|
const n = countArguments(arguments);
|
|
if (n >= 1)
|
|
return fn(a, b, c);
|
|
return curried;
|
|
};
|
|
}
|
|
exports.curry1 = curry1;
|
|
function curry2(fn) {
|
|
return function curried(a, b, ...args) {
|
|
const [c, d] = args;
|
|
const n = countArguments(arguments, 2);
|
|
if (b === exports._ || c === exports._ || d === exports._) {
|
|
throw new Error('Can only use placeholder on first argument of this function.');
|
|
}
|
|
if (n >= 2) {
|
|
if (a === exports._)
|
|
return curry1((a, c, d) => fn(a, b, c, d));
|
|
return fn(a, b, c, d);
|
|
}
|
|
if (n === 1)
|
|
return curry1((b, c, d) => fn(a, b, c, d));
|
|
return curried;
|
|
};
|
|
}
|
|
exports.curry2 = curry2;
|
|
function curry3(fn) {
|
|
return function curried(a, b, c, ...args) {
|
|
const [d, e] = args;
|
|
const n = countArguments(arguments, 3);
|
|
if (c === exports._ || d === exports._ || e === exports._) {
|
|
throw new Error('Can only use placeholder on first or second argument of this function.');
|
|
}
|
|
if (n >= 3) {
|
|
if (a === exports._) {
|
|
if (b === exports._)
|
|
return curry2((a, b, d, e) => fn(a, b, c, d, e));
|
|
return curry1((a, d, e) => fn(a, b, c, d, e));
|
|
}
|
|
if (b === exports._)
|
|
return curry1((b, d, e) => fn(a, b, c, d, e));
|
|
return fn(a, b, c, d, e);
|
|
}
|
|
if (n === 2) {
|
|
if (a === exports._)
|
|
return curry2((a, c, d, e) => fn(a, b, c, d, e));
|
|
return curry1((c, d, e) => fn(a, b, c, d, e));
|
|
}
|
|
if (n === 1)
|
|
return curry2((b, c, d, e) => fn(a, b, c, d, e));
|
|
return curried;
|
|
};
|
|
}
|
|
exports.curry3 = curry3;
|
|
function curry4(fn) {
|
|
return function curried(a, b, c, d, ...args) {
|
|
const [e, f] = args;
|
|
const n = countArguments(arguments, 4);
|
|
if (d === exports._ || e === exports._ || f === exports._) {
|
|
throw new Error('Can only use placeholder on first, second or third argument of this function.');
|
|
}
|
|
if (n >= 4) {
|
|
if (a === exports._) {
|
|
if (b === exports._) {
|
|
if (c === exports._)
|
|
return curry3((a, b, c, e, f) => fn(a, b, c, d, e, f));
|
|
return curry2((a, b, e, f) => fn(a, b, c, d, e, f));
|
|
}
|
|
if (c === exports._)
|
|
return curry2((a, c, e, f) => fn(a, b, c, d, e, f));
|
|
return curry1((a, e, f) => fn(a, b, c, d, e, f));
|
|
}
|
|
if (b === exports._) {
|
|
if (c === exports._)
|
|
return curry2((b, c, e, f) => fn(a, b, c, d, e, f));
|
|
return curry1((b, e, f) => fn(a, b, c, d, e, f));
|
|
}
|
|
if (c === exports._)
|
|
return curry1((c, e, f) => fn(a, b, c, d, e, f));
|
|
return fn(a, b, c, d, e, f);
|
|
}
|
|
if (n === 3) {
|
|
if (a === exports._) {
|
|
if (b === exports._)
|
|
return curry3((a, b, d, e, f) => fn(a, b, c, d, e, f));
|
|
return curry2((a, d, e, f) => fn(a, b, c, d, e, f));
|
|
}
|
|
if (b === exports._)
|
|
return curry2((b, d, e, f) => fn(a, b, c, d, e, f));
|
|
return curry1((d, e, f) => fn(a, b, c, d, e, f));
|
|
}
|
|
if (n === 2) {
|
|
if (a === exports._)
|
|
return curry3((a, c, d, e, f) => fn(a, b, c, d, e, f));
|
|
return curry2((c, d, e, f) => fn(a, b, c, d, e, f));
|
|
}
|
|
if (n === 1)
|
|
return curry3((b, c, d, e, f) => fn(a, b, c, d, e, f));
|
|
return curried;
|
|
};
|
|
}
|
|
exports.curry4 = curry4;
|
|
function curry(fn, length = fn.length) {
|
|
return [fn, curry1, curry2, curry3, curry4][length](fn);
|
|
}
|
|
exports.default = curry;
|
|
//# sourceMappingURL=curry.js.map
|