-
-
Save rmetzler/796627 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var _ = require('underscore')._, | |
events = require('events'); | |
var Actor = function Actor(object) { | |
var postman = new events.EventEmitter(), | |
mailbox = [], | |
that = this, | |
monitor = function monitor() { | |
var data = mailbox.shift(); | |
if (data) { | |
_.defer(function () { | |
that.act(data); | |
}); | |
} | |
_.defer(monitor); | |
}; | |
this.send = function send() { | |
var args = _.toArray(arguments), | |
data_obj = { | |
message: args.shift(), | |
context: { | |
args: args | |
} | |
}; | |
if (_.last(args) instanceof Actor) { | |
data_obj.context.sender = args.pop() | |
} else if (send.caller.actor && send.caller.actor instanceof Actor) { | |
data_obj.context.sender = send.caller.actor; | |
} | |
postman.emit('message', data_obj); | |
}; | |
this.act = function act(data) { | |
this[data.message].apply(this, [data.context]); | |
}; | |
this.spawn = function spawn() { | |
return _.clone(this); | |
}; | |
_.extend(this, object); | |
_(this).map( function (val, key) { | |
if (_.isFunction(val)) { | |
val.actor = that; | |
} | |
}); | |
postman.on('message', function (data) { | |
mailbox.push(data); | |
}); | |
_.defer(monitor); | |
return this; | |
}; | |
var pinger = new Actor({ | |
ping: function ping(context) { | |
console.log('Got ping!'); | |
context.sender.send('pong', context.args); | |
} | |
}); | |
var plop = { | |
pong: function pong(context) { | |
console.log('Got %s', context.args.toString()); | |
context.sender.send('ping', context.args); | |
} | |
}; | |
_.range(0,100).map( function (i) { | |
var actor = new Actor(plop); | |
_.delay(function () { | |
actor.send('pong', i, pinger); | |
}, (i * 5)); | |
return actor; | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment