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.
		
		
		
		
		
			
		
			
				
					
					
						
							84 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							84 lines
						
					
					
						
							2.3 KiB
						
					
					
				// MIT license (by Elan Shanker).
 | 
						|
(function(globals) {
 | 
						|
  'use strict';
 | 
						|
 | 
						|
  var executeSync = function(){
 | 
						|
    var args = Array.prototype.slice.call(arguments);
 | 
						|
    if (typeof args[0] === 'function'){
 | 
						|
      args[0].apply(null, args.splice(1));
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  var executeAsync = function(fn){
 | 
						|
    if (typeof setImmediate === 'function') {
 | 
						|
      setImmediate(fn);
 | 
						|
    } else if (typeof process !== 'undefined' && process.nextTick) {
 | 
						|
      process.nextTick(fn);
 | 
						|
    } else {
 | 
						|
      setTimeout(fn, 0);
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  var makeIterator = function (tasks) {
 | 
						|
    var makeCallback = function (index) {
 | 
						|
      var fn = function () {
 | 
						|
        if (tasks.length) {
 | 
						|
          tasks[index].apply(null, arguments);
 | 
						|
        }
 | 
						|
        return fn.next();
 | 
						|
      };
 | 
						|
      fn.next = function () {
 | 
						|
        return (index < tasks.length - 1) ? makeCallback(index + 1): null;
 | 
						|
      };
 | 
						|
      return fn;
 | 
						|
    };
 | 
						|
    return makeCallback(0);
 | 
						|
  };
 | 
						|
  
 | 
						|
  var _isArray = Array.isArray || function(maybeArray){
 | 
						|
    return Object.prototype.toString.call(maybeArray) === '[object Array]';
 | 
						|
  };
 | 
						|
 | 
						|
  var waterfall = function (tasks, callback, forceAsync) {
 | 
						|
    var nextTick = forceAsync ? executeAsync : executeSync;
 | 
						|
    callback = callback || function () {};
 | 
						|
    if (!_isArray(tasks)) {
 | 
						|
      var err = new Error('First argument to waterfall must be an array of functions');
 | 
						|
      return callback(err);
 | 
						|
    }
 | 
						|
    if (!tasks.length) {
 | 
						|
      return callback();
 | 
						|
    }
 | 
						|
    var wrapIterator = function (iterator) {
 | 
						|
      return function (err) {
 | 
						|
        if (err) {
 | 
						|
          callback.apply(null, arguments);
 | 
						|
          callback = function () {};
 | 
						|
        } else {
 | 
						|
          var args = Array.prototype.slice.call(arguments, 1);
 | 
						|
          var next = iterator.next();
 | 
						|
          if (next) {
 | 
						|
            args.push(wrapIterator(next));
 | 
						|
          } else {
 | 
						|
            args.push(callback);
 | 
						|
          }
 | 
						|
          nextTick(function () {
 | 
						|
            iterator.apply(null, args);
 | 
						|
          });
 | 
						|
        }
 | 
						|
      };
 | 
						|
    };
 | 
						|
    wrapIterator(makeIterator(tasks))();
 | 
						|
  };
 | 
						|
 | 
						|
  if (typeof define !== 'undefined' && define.amd) {
 | 
						|
    define([], function () {
 | 
						|
      return waterfall;
 | 
						|
    }); // RequireJS
 | 
						|
  } else if (typeof module !== 'undefined' && module.exports) {
 | 
						|
    module.exports = waterfall; // CommonJS
 | 
						|
  } else {
 | 
						|
    globals.waterfall = waterfall; // <script>
 | 
						|
  }
 | 
						|
})(this);
 |