procedure

procedure

by Chelo Quilón

JavaScript

/* jslint node: true */
"use strict";

function Procedure(){
  this.jobs = [];
  this.main = new Queue();
  this.main.main = true;
  this.main.procedure = this;
}
  Procedure.prototype.add = function(name,func){
    var procedure = this;
    var args = Array.prototype.slice.call(arguments);
    if(typeof name !== "string"){
        func = name;
        name = "Job-"+procedure.jobs.length;
        args = args.slice(1);
    } else {
        args = args.slice(2);
    }
    procedure.jobs.push({name:name,func:func,args:args});
    return procedure;
  };
  Procedure.prototype.queue = function(){
    return this.resolve('queue');
  };
  Procedure.prototype.race = function(){
    return this.resolve('race');
  };
  Procedure.prototype.resolve = function(mode){
    var procedure = this;
    var resolve;
    resolve = mode === 'race' ? new Race() : new Queue();
    resolve.jobs = procedure.jobs;
    resolve.procedure = procedure;
    procedure.jobs = [];
    resolve.handler = function(error){
      var data = Array.prototype.slice.call(arguments);
      if(error){
        procedure.main.handler.apply(procedure.main,data);
      } else {
        procedure.main.done.apply(procedure.main,[undefined].concat(data));
      }
    };
    procedure.main.jobs.push({func:resolve.launch.bind(resolve),args:[]});
    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.handler = undefined;
  this.jobs = [];
  this.results = {};
  this.errors = [];
}
  Race.prototype.launch = function(){
    var data = Array.prototype.slice.call(arguments);
    data = data.slice(0,-1);
    if(this.jobs.length===0){
      this.handler(undefined,this.results);
    } else {
      for(var i = 0,l=this.jobs.length;i<l;i++){
        var job = this.jobs[i];
       ...