You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							92 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
	
	
							92 lines
						
					
					
						
							3.2 KiB
						
					
					
				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;
 | 
						|
 |