curry-this
Version:
Currying made simple
70 lines (53 loc) • 2.04 kB
JavaScript
Object.defineProperty(exports, '__esModule', {
value: true
});
// istanbul ignore next
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
var arity = require('util-arity');
exports['default'] = function (_ref) {
var placeholder = _ref.placeholder;
var merge = function merge(dest, origin) {
var newArgs = dest.map(function (i) {
var elem = i;
if (i === placeholder && origin[0]) {
elem = origin.shift();
}
return elem;
});
return newArgs.concat(origin);
};
var actualLength = function actualLength(arr) {
return arr.reduce(function (len, curr) {
return curr === placeholder ? len : len + 1;
}, 0);
};
var containsPlaceholder = function containsPlaceholder(args) {
return args.some(function (arg) {
return arg === placeholder;
});
};
function curry() {
var fn = this;
for (var _len = arguments.length, initialArgs = Array(_len), _key = 0; _key < _len; _key++) {
initialArgs[_key] = arguments[_key];
}
var len = containsPlaceholder(initialArgs) ? initialArgs.length : fn.length;
var _curry = function _curry() {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
var f = function f() {
for (var _len3 = arguments.length, newArgs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
newArgs[_key3] = arguments[_key3];
}
var concatedArgs = merge(args, newArgs);
return actualLength(concatedArgs) >= len ? fn.apply(undefined, _toConsumableArray(concatedArgs.slice(0, len))) : _curry.apply(undefined, _toConsumableArray(concatedArgs));
};
return arity(len - actualLength(args), f);
};
return _curry.apply(undefined, initialArgs)();
}
return curry;
};
module.exports = exports['default'];
;