_createCurryWrapper.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. var apply = require('./_apply'),
  2. createCtorWrapper = require('./_createCtorWrapper'),
  3. createHybridWrapper = require('./_createHybridWrapper'),
  4. createRecurryWrapper = require('./_createRecurryWrapper'),
  5. getHolder = require('./_getHolder'),
  6. replaceHolders = require('./_replaceHolders'),
  7. root = require('./_root');
  8. /**
  9. * Creates a function that wraps `func` to enable currying.
  10. *
  11. * @private
  12. * @param {Function} func The function to wrap.
  13. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper`
  14. * for more details.
  15. * @param {number} arity The arity of `func`.
  16. * @returns {Function} Returns the new wrapped function.
  17. */
  18. function createCurryWrapper(func, bitmask, arity) {
  19. var Ctor = createCtorWrapper(func);
  20. function wrapper() {
  21. var length = arguments.length,
  22. args = Array(length),
  23. index = length,
  24. placeholder = getHolder(wrapper);
  25. while (index--) {
  26. args[index] = arguments[index];
  27. }
  28. var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
  29. ? []
  30. : replaceHolders(args, placeholder);
  31. length -= holders.length;
  32. if (length < arity) {
  33. return createRecurryWrapper(
  34. func, bitmask, createHybridWrapper, wrapper.placeholder, undefined,
  35. args, holders, undefined, undefined, arity - length);
  36. }
  37. var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
  38. return apply(fn, this, args);
  39. }
  40. return wrapper;
  41. }
  42. module.exports = createCurryWrapper;