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.
		
		
		
		
		
			
		
			
				
					
					
						
							78 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
	
	
							78 lines
						
					
					
						
							2.2 KiB
						
					
					
				var LodashWrapper = require('./_LodashWrapper'), | 
						|
    flatRest = require('./_flatRest'), | 
						|
    getData = require('./_getData'), | 
						|
    getFuncName = require('./_getFuncName'), | 
						|
    isArray = require('./isArray'), | 
						|
    isLaziable = require('./_isLaziable'); | 
						|
 | 
						|
/** Error message constants. */ | 
						|
var FUNC_ERROR_TEXT = 'Expected a function'; | 
						|
 | 
						|
/** Used to compose bitmasks for function metadata. */ | 
						|
var WRAP_CURRY_FLAG = 8, | 
						|
    WRAP_PARTIAL_FLAG = 32, | 
						|
    WRAP_ARY_FLAG = 128, | 
						|
    WRAP_REARG_FLAG = 256; | 
						|
 | 
						|
/** | 
						|
 * Creates a `_.flow` or `_.flowRight` function. | 
						|
 * | 
						|
 * @private | 
						|
 * @param {boolean} [fromRight] Specify iterating from right to left. | 
						|
 * @returns {Function} Returns the new flow function. | 
						|
 */ | 
						|
function createFlow(fromRight) { | 
						|
  return flatRest(function(funcs) { | 
						|
    var length = funcs.length, | 
						|
        index = length, | 
						|
        prereq = LodashWrapper.prototype.thru; | 
						|
 | 
						|
    if (fromRight) { | 
						|
      funcs.reverse(); | 
						|
    } | 
						|
    while (index--) { | 
						|
      var func = funcs[index]; | 
						|
      if (typeof func != 'function') { | 
						|
        throw new TypeError(FUNC_ERROR_TEXT); | 
						|
      } | 
						|
      if (prereq && !wrapper && getFuncName(func) == 'wrapper') { | 
						|
        var wrapper = new LodashWrapper([], true); | 
						|
      } | 
						|
    } | 
						|
    index = wrapper ? index : length; | 
						|
    while (++index < length) { | 
						|
      func = funcs[index]; | 
						|
 | 
						|
      var funcName = getFuncName(func), | 
						|
          data = funcName == 'wrapper' ? getData(func) : undefined; | 
						|
 | 
						|
      if (data && isLaziable(data[0]) && | 
						|
            data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && | 
						|
            !data[4].length && data[9] == 1 | 
						|
          ) { | 
						|
        wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); | 
						|
      } else { | 
						|
        wrapper = (func.length == 1 && isLaziable(func)) | 
						|
          ? wrapper[funcName]() | 
						|
          : wrapper.thru(func); | 
						|
      } | 
						|
    } | 
						|
    return function() { | 
						|
      var args = arguments, | 
						|
          value = args[0]; | 
						|
 | 
						|
      if (wrapper && args.length == 1 && isArray(value)) { | 
						|
        return wrapper.plant(value).value(); | 
						|
      } | 
						|
      var index = 0, | 
						|
          result = length ? funcs[index].apply(this, args) : value; | 
						|
 | 
						|
      while (++index < length) { | 
						|
        result = funcs[index].call(this, result); | 
						|
      } | 
						|
      return result; | 
						|
    }; | 
						|
  }); | 
						|
} | 
						|
 | 
						|
module.exports = createFlow;
 | 
						|
 |