00001 var LodashWrapper = require('./_LodashWrapper'), 00002 flatRest = require('./_flatRest'), 00003 getData = require('./_getData'), 00004 getFuncName = require('./_getFuncName'), 00005 isArray = require('./isArray'), 00006 isLaziable = require('./_isLaziable'); 00007 00009 var FUNC_ERROR_TEXT = 'Expected a function'; 00010 00012 var WRAP_CURRY_FLAG = 8, 00013 WRAP_PARTIAL_FLAG = 32, 00014 WRAP_ARY_FLAG = 128, 00015 WRAP_REARG_FLAG = 256; 00016 00024 function createFlow(fromRight) { 00025 return flatRest(function(funcs) { 00026 var length = funcs.length, 00027 index = length, 00028 prereq = LodashWrapper.prototype.thru; 00029 00030 if (fromRight) { 00031 funcs.reverse(); 00032 } 00033 while (index--) { 00034 var func = funcs[index]; 00035 if (typeof func != 'function') { 00036 throw new TypeError(FUNC_ERROR_TEXT); 00037 } 00038 if (prereq && !wrapper && getFuncName(func) == 'wrapper') { 00039 var wrapper = new LodashWrapper([], true); 00040 } 00041 } 00042 index = wrapper ? index : length; 00043 while (++index < length) { 00044 func = funcs[index]; 00045 00046 var funcName = getFuncName(func), 00047 data = funcName == 'wrapper' ? getData(func) : undefined; 00048 00049 if (data && isLaziable(data[0]) && 00050 data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && 00051 !data[4].length && data[9] == 1 00052 ) { 00053 wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); 00054 } else { 00055 wrapper = (func.length == 1 && isLaziable(func)) 00056 ? wrapper[funcName]() 00057 : wrapper.thru(func); 00058 } 00059 } 00060 return function() { 00061 var args = arguments, 00062 value = args[0]; 00063 00064 if (wrapper && args.length == 1 && isArray(value)) { 00065 return wrapper.plant(value).value(); 00066 } 00067 var index = 0, 00068 result = length ? funcs[index].apply(this, args) : value; 00069 00070 while (++index < length) { 00071 result = funcs[index].call(this, result); 00072 } 00073 return result; 00074 }; 00075 }); 00076 } 00077 00078 module.exports = createFlow;