Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<p>Open the console to see the Actor and Signals in action!</p>
 
// HELPERS
var Signal = function Signal(){
  this.slots = [];
};
Signal.prototype = {
  add: function(f){
    this.slots.push(f);
  }
  ,dispatch: function(){
    var slots = this.slots.slice()
        ,len
        ,i
        ,ret;
    
    for (i = 0, len = slots.length; i < len; i++){
      ret = slots[i].apply(this, arguments);
      if(ret === false){
        break;
      }
    }
  }
  ,remove: function(f){
    this.slots.splice(this.slots.indexOf(f), 1);
  }
}
// THE THING TO LOOK AT  
  
var actors = {
  'Fibonaci': { path: 'http://jsbin.com/orexal/25' }
};
function actorsInit( actors ){
  
  for(var i in actors){
    if(actors.hasOwnProperty(i)){
      
      actors[i] = (function(actorName, actorFace){
        
        var Actor = function(cb){
          var self = this;
          this.worker = new Worker(actorFace.path);
          this.worker.addEventListener('message', function(e){
            console.log('from worker', actorName, e);
            
            if(e.data.signal === 'siginit'){
             
              // setup signals
              for(var i = 0; i < e.data.args.length; i++){
                  self[ e.data.args[i] ] = new Signal();
              }
              
              if(cb){ cb(this); }
              
              return
            }
            
            var sig = self[e.data.signal];
            e.data.args.length // crappy array test
              ? sig.dispatch.apply(sig, e.data.args)
              : sig.dispatch.call(sig, e.data.args)
          }, false);
          
        }
            
        return Actor;
        
      })(i, actors[i])
    }
  }
}
// TEST OF THE THING TO LOOK AT
actorsInit(actors);
console.log(actors); // entries are now constructors
var f = new actors.Fibonaci(function(){
  console.log(f);
  f.stepped.add(function(){
    console.log('got a stepped!', arguments);
  })
  f.stopped.add(function(){
    console.log('got a stopped!', arguments);
  })
    
});
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
kirbysayshipro
0viewers