| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | 
							- 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;
 
 
  |