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.
		
		
		
		
		
			
		
			
				
					93 lines
				
				3.2 KiB
			
		
		
			
		
	
	
					93 lines
				
				3.2 KiB
			| 
											3 years ago
										 | 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; |