code: function AsyncQueue(tasks, fn) {
          // better compression for shrinking `this`
          var self = this;
  
          // TODO: exposing this is not safe
          self.tasks = [];
          self.callbacks = [];
          self.errors = [];
  
          // return values of Promise
          self.data = {};
  
          // resolved task index
          self.nextTask = 0;
  
          // resolved callback index
          self.nextCallback = 0;
  
          // -1 (default) means not waiting for AsyncQueue#then
          self.until = -1;
  
          // queue is executing callback
          self.digest = false;
  
          // add tasks and callbacks
          self.add(tasks).whenDone(fn);
      }
docs: @public
  @name AsyncQueue
  Create a semi-Promise for asyncJS
  @constructor
  
  @param {Array|String|Function} tasks
  @param {Function} fn