libs/modularize/_createWrap.js
function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
  var isBindKey = bitmask & BIND_KEY_FLAG;
  if (!isBindKey && typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  var length = partials ? partials.length : 0;
  if (!length) {
    bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
    partials = holders = undefined;
  }
  ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
  arity = arity === undefined ? arity : toInteger(arity);
  length -= holders ? holders.length : 0;

  if (bitmask & PARTIAL_RIGHT_FLAG) {
    var partialsRight = partials,
        holdersRight = holders;

    partials = holders = undefined;
  }
  var data = isBindKey ? undefined : getData(func);

  var newData = [
    func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
    argPos, ary, arity
  ];

  if (data) {
    mergeData(newData, data);
  }
  func = newData[0];
  bitmask = newData[1];
  thisArg = newData[2];
  partials = newData[3];
  holders = newData[4];
  arity = newData[9] = newData[9] == null
    ? (isBindKey ? 0 : func.length)
    : nativeMax(newData[9] - length, 0);

  if (!arity && bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG)) {
    bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG);
  }
  if (!bitmask || bitmask == BIND_FLAG) {
    var result = createBind(func, bitmask, thisArg);
  } else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) {
    result = createCurry(func, bitmask, arity);
  } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) {
    result = createPartial(func, bitmask, thisArg, partials);
  } else {
    result = createHybrid.apply(undefined, newData);
  }
  var setter = data ? baseSetData : setData;
  return setWrapToString(setter(result, newData), func, bitmask);
}
function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
  var isBindKey = bitmask & BIND_KEY_FLAG;
  if (!isBindKey && typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  var length = partials ? partials.length : 0;
  if (!length) {
    bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
    partials = holders = undefined;
  }
  ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
  arity = arity === undefined ? arity : toInteger(arity);
  length -= holders ? holders.length : 0;

  if (bitmask & PARTIAL_RIGHT_FLAG) {
    var partialsRight = partials,
        holdersRight = holders;

    partials = holders = undefined;
  }
  var data = isBindKey ? undefined : getData(func);

  var newData = [
    func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
    argPos, ary, arity
  ];

  if (data) {
    mergeData(newData, data);
  }
  func = newData[0];
  bitmask = newData[1];
  thisArg = newData[2];
  partials = newData[3];
  holders = newData[4];
  arity = newData[9] = newData[9] == null
    ? (isBindKey ? 0 : func.length)
    : nativeMax(newData[9] - length, 0);

  if (!arity && bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG)) {
    bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG);
  }
  if (!bitmask || bitmask == BIND_FLAG) {
    var result = createBind(func, bitmask, thisArg);
  } else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) {
    result = createCurry(func, bitmask, arity);
  } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) {
    result = createPartial(func, bitmask, thisArg, partials);
  } else {
    result = createHybrid.apply(undefined, newData);
  }
  var setter = data ? baseSetData : setData;
  return setWrapToString(setter(result, newData), func, bitmask);
}
function createWrap ( func , bitmask , thisArg , partials , holders , argPos , ary , arity ) { var isBindKey = bitmask & BIND_KEY_FLAG ; if ( ! isBindKey && typeof func != 'function' ) { throw new TypeError ( FUNC_ERROR_TEXT ) ; } var length = partials ? partials . length : 0 ; if ( ! length ) { bitmask &= ~ ( PARTIAL_FLAG | PARTIAL_RIGHT_FLAG ) ; partials = holders = undefined ; } ary = ary === undefined ? ary : nativeMax ( toInteger ( ary ) , 0 ) ; arity = arity === undefined ? arity : toInteger ( arity ) ; length -= holders ? holders . length : 0 ; if ( bitmask & PARTIAL_RIGHT_FLAG ) { var partialsRight = partials , holdersRight = holders ; partials = holders = undefined ; } var data = isBindKey ? undefined : getData ( func ) ; var newData = [ func , bitmask , thisArg , partials , holders , partialsRight , holdersRight , argPos , ary , arity ] ; if ( data ) { mergeData ( newData , data ) ; } func = newData [ 0 ] ; bitmask = newData [ 1 ] ; thisArg = newData [ 2 ] ; partials = newData [ 3 ] ; holders = newData [ 4 ] ; arity = newData [ 9 ] = newData [ 9 ] == null ? ( isBindKey ? 0 : func . length ) : nativeMax ( newData [ 9 ] - length , 0 ) ; if ( ! arity && bitmask & ( CURRY_FLAG | CURRY_RIGHT_FLAG ) ) { bitmask &= ~ ( CURRY_FLAG | CURRY_RIGHT_FLAG ) ; } if ( ! bitmask || bitmask == BIND_FLAG ) { var result = createBind ( func , bitmask , thisArg ) ; } else if ( bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG ) { result = createCurry ( func , bitmask , arity ) ; } else if ( ( bitmask == PARTIAL_FLAG || bitmask == ( BIND_FLAG | PARTIAL_FLAG ) ) && ! holders . length ) { result = createPartial ( func , bitmask , thisArg , partials ) ; } else { result = createHybrid . apply ( undefined , newData ) ; } var setter = data ? baseSetData : setData ; return setWrapToString ( setter ( result , newData ) , func , bitmask ) ; }
Creates a function that either curries or invokes `func` with optional
`this` binding and partially applied arguments.

@private
@param {Function|string} func The function or method name to wrap.
@param {number} bitmask The bitmask flags.
The bitmask may be composed of the following flags:
1 - `_.bind`
2 - `_.bindKey`
4 - `_.curry` or `_.curryRight` of a bound function
8 - `_.curry`
16 - `_.curryRight`
32 - `_.partial`
64 - `_.partialRight`
128 - `_.rearg`
256 - `_.ary`
512 - `_.flip`
@param {*} [thisArg] The `this` binding of `func`.
@param {Array} [partials] The arguments to be partially applied.
@param {Array} [holders] The `partials` 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.
Creates a function that either curries or invokes func with optional this binding and partially applied arguments .