time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

_createFlow.js (2249B)


      1 var LodashWrapper = require('./_LodashWrapper'),
      2     flatRest = require('./_flatRest'),
      3     getData = require('./_getData'),
      4     getFuncName = require('./_getFuncName'),
      5     isArray = require('./isArray'),
      6     isLaziable = require('./_isLaziable');
      7 
      8 /** Error message constants. */
      9 var FUNC_ERROR_TEXT = 'Expected a function';
     10 
     11 /** Used to compose bitmasks for function metadata. */
     12 var WRAP_CURRY_FLAG = 8,
     13     WRAP_PARTIAL_FLAG = 32,
     14     WRAP_ARY_FLAG = 128,
     15     WRAP_REARG_FLAG = 256;
     16 
     17 /**
     18  * Creates a `_.flow` or `_.flowRight` function.
     19  *
     20  * @private
     21  * @param {boolean} [fromRight] Specify iterating from right to left.
     22  * @returns {Function} Returns the new flow function.
     23  */
     24 function createFlow(fromRight) {
     25   return flatRest(function(funcs) {
     26     var length = funcs.length,
     27         index = length,
     28         prereq = LodashWrapper.prototype.thru;
     29 
     30     if (fromRight) {
     31       funcs.reverse();
     32     }
     33     while (index--) {
     34       var func = funcs[index];
     35       if (typeof func != 'function') {
     36         throw new TypeError(FUNC_ERROR_TEXT);
     37       }
     38       if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
     39         var wrapper = new LodashWrapper([], true);
     40       }
     41     }
     42     index = wrapper ? index : length;
     43     while (++index < length) {
     44       func = funcs[index];
     45 
     46       var funcName = getFuncName(func),
     47           data = funcName == 'wrapper' ? getData(func) : undefined;
     48 
     49       if (data && isLaziable(data[0]) &&
     50             data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
     51             !data[4].length && data[9] == 1
     52           ) {
     53         wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
     54       } else {
     55         wrapper = (func.length == 1 && isLaziable(func))
     56           ? wrapper[funcName]()
     57           : wrapper.thru(func);
     58       }
     59     }
     60     return function() {
     61       var args = arguments,
     62           value = args[0];
     63 
     64       if (wrapper && args.length == 1 && isArray(value)) {
     65         return wrapper.plant(value).value();
     66       }
     67       var index = 0,
     68           result = length ? funcs[index].apply(this, args) : value;
     69 
     70       while (++index < length) {
     71         result = funcs[index].call(this, result);
     72       }
     73       return result;
     74     };
     75   });
     76 }
     77 
     78 module.exports = createFlow;