| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | var composeArgs = require('./_composeArgs'),    composeArgsRight = require('./_composeArgsRight'),    countHolders = require('./_countHolders'),    createCtor = require('./_createCtor'),    createRecurry = require('./_createRecurry'),    getHolder = require('./_getHolder'),    reorder = require('./_reorder'),    replaceHolders = require('./_replaceHolders'),    root = require('./_root');/** Used to compose bitmasks for function metadata. */var WRAP_BIND_FLAG = 1,    WRAP_BIND_KEY_FLAG = 2,    WRAP_CURRY_FLAG = 8,    WRAP_CURRY_RIGHT_FLAG = 16,    WRAP_ARY_FLAG = 128,    WRAP_FLIP_FLAG = 512;/** * Creates a function that wraps `func` to invoke it with optional `this` * binding of `thisArg`, partial application, and currying. * * @private * @param {Function|string} func The function or method name to wrap. * @param {number} bitmask The bitmask flags. See `createWrap` for more details. * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to prepend to those provided to *  the new function. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [partialsRight] The arguments to append to those provided *  to the new function. * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {  var isAry = bitmask & WRAP_ARY_FLAG,      isBind = bitmask & WRAP_BIND_FLAG,      isBindKey = bitmask & WRAP_BIND_KEY_FLAG,      isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),      isFlip = bitmask & WRAP_FLIP_FLAG,      Ctor = isBindKey ? undefined : createCtor(func);  function wrapper() {    var length = arguments.length,        args = Array(length),        index = length;    while (index--) {      args[index] = arguments[index];    }    if (isCurried) {      var placeholder = getHolder(wrapper),          holdersCount = countHolders(args, placeholder);    }    if (partials) {      args = composeArgs(args, partials, holders, isCurried);    }    if (partialsRight) {      args = composeArgsRight(args, partialsRight, holdersRight, isCurried);    }    length -= holdersCount;    if (isCurried && length < arity) {      var newHolders = replaceHolders(args, placeholder);      return createRecurry(        func, bitmask, createHybrid, wrapper.placeholder, thisArg,        args, newHolders, argPos, ary, arity - length      );    }    var thisBinding = isBind ? thisArg : this,        fn = isBindKey ? thisBinding[func] : func;    length = args.length;    if (argPos) {      args = reorder(args, argPos);    } else if (isFlip && length > 1) {      args.reverse();    }    if (isAry && ary < length) {      args.length = ary;    }    if (this && this !== root && this instanceof wrapper) {      fn = Ctor || createCtor(fn);    }    return fn.apply(thisBinding, args);  }  return wrapper;}module.exports = createHybrid;
 |