_curryN.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import _arity from "./_arity.js";
  2. import _isPlaceholder from "./_isPlaceholder.js";
  3. /**
  4. * Internal curryN function.
  5. *
  6. * @private
  7. * @category Function
  8. * @param {Number} length The arity of the curried function.
  9. * @param {Array} received An array of arguments received thus far.
  10. * @param {Function} fn The function to curry.
  11. * @return {Function} The curried function.
  12. */
  13. export default function _curryN(length, received, fn) {
  14. return function () {
  15. var combined = [];
  16. var argsIdx = 0;
  17. var left = length;
  18. var combinedIdx = 0;
  19. while (combinedIdx < received.length || argsIdx < arguments.length) {
  20. var result;
  21. if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {
  22. result = received[combinedIdx];
  23. } else {
  24. result = arguments[argsIdx];
  25. argsIdx += 1;
  26. }
  27. combined[combinedIdx] = result;
  28. if (!_isPlaceholder(result)) {
  29. left -= 1;
  30. }
  31. combinedIdx += 1;
  32. }
  33. return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn));
  34. };
  35. }