Queue Class - Procedure Library

https://github.com/bifuer/procedure

by Chelo Quilón

JavaScript

// -------------------------------------- LIBRARY CODE ---------------------------------------------

function Procedure(data){
  this.data = data || {};
  this.jobs = [];
  this.main = new Queue();
  this.main.data = this.data;
}
  Procedure.prototype.add = function(func){
    var procedure = this;
    var args = Array.prototype.slice.call(arguments).slice(1);
    procedure.jobs.push({func:func,args:args});
    return procedure;
  };
  Procedure.prototype.queue = function(handler){
    var procedure = this;
    var queue = new Queue();
    queue.jobs = procedure.jobs;
    queue.data = procedure.data;
    procedure.jobs = [];
    queue.handler = function(error){
      if(handler){handler.call(queue,error);}
      if(error){
        procedure.main.handler(error);
      } else {
        procedure.main.done();
      }
    };
    procedure.main.jobs.push({func:queue.launch.bind(queue)});
    return procedure;
  };
  Procedure.prototype.race = function(handler){
    var procedure = this;
    var race = new Race();
    race.jobs = procedure.jobs;
    race.data = procedure.data;
    procedure.jobs = [];
    race.handler = function(error){
      if(handler){handler.call(race,error);}
      if(error){
        procedure.main.handler(error);
      } else {
        procedure.main.done();
      }
    };
    procedure.main.jobs.push({func:race.launch.bind(race)});
    return procedure;
  };
  Procedure.prototype.launch = function(handler){
    var procedure = this;
    procedure.main.handler = handler;
    procedure.main.jobs = procedure.main.jobs.concat(procedure.jobs);
    procedure.main.launch();
  };


Procedure.Race = Race;
function Race(){
  this.jobs = [];
  this.data= {};
  this.counter = 0;
}
  Race.prototype.launch = function(){
    this.counter = this.jobs.length;
    for(var i = 0,l=this.jobs.length;i<l;i++){
      Procedure.Launcher(this,this.jobs[i]);
    }
  };
  Race.prototype.done = function(){
    if(--this.counter === 0){
     this.handler();
    }
  };
 ...