Merge pull request #15 from bitpay/add/funnel
Add simple funnel implementation
This commit is contained in:
commit
3bb9d6a4d3
45
lib/funnel.js
Normal file
45
lib/funnel.js
Normal file
@ -0,0 +1,45 @@
|
||||
'use strict';
|
||||
|
||||
|
||||
var bitcore = require('bitcore');
|
||||
var $ = bitcore.util.preconditions;
|
||||
var _ = bitcore.deps._;
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
var util = require('util');
|
||||
|
||||
function Funnel() {
|
||||
this.handlers = {};
|
||||
}
|
||||
util.inherits(Funnel, EventEmitter);
|
||||
|
||||
Funnel.prototype.process = function(e) {
|
||||
var queue = [];
|
||||
var done = [];
|
||||
queue.push(e);
|
||||
while (queue.length !== 0) {
|
||||
var event = queue.shift();
|
||||
var handlers = this.handlers[event.constructor.name] || [];
|
||||
handlers.forEach(function(handler) {
|
||||
var responses = handler(event);
|
||||
if (responses && responses.length > 0) {
|
||||
queue = queue.concat(responses);
|
||||
}
|
||||
});
|
||||
done.push(event);
|
||||
}
|
||||
done.forEach(function(event) {
|
||||
//that.emit(event.name, event);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
|
||||
Funnel.prototype.register = function(clazz, handler) {
|
||||
$.checkArgument(_.isFunction(handler));
|
||||
var name = clazz.name;
|
||||
this.handlers[name] = this.handlers[name] || [];
|
||||
this.handlers[name].push(handler);
|
||||
};
|
||||
|
||||
|
||||
module.exports = Funnel;
|
||||
70
test/funnel.js
Normal file
70
test/funnel.js
Normal file
@ -0,0 +1,70 @@
|
||||
'use strict';
|
||||
|
||||
var chai = require('chai');
|
||||
var should = chai.should();
|
||||
var sinon = require('sinon');
|
||||
|
||||
var Funnel = require('../lib/funnel');
|
||||
|
||||
describe('Funnel', function() {
|
||||
|
||||
it('instantiate', function() {
|
||||
var f = new Funnel();
|
||||
should.exist(f);
|
||||
});
|
||||
|
||||
describe('process', function() {
|
||||
function FooEvent() {}
|
||||
function BarEvent() {}
|
||||
var foo = new FooEvent();
|
||||
var bar = new BarEvent();
|
||||
foo.x = 2;
|
||||
bar.y = 3;
|
||||
|
||||
it('no handlers registered', function() {
|
||||
var f = new Funnel();
|
||||
f.process.bind(f, foo).should.not.throw();
|
||||
});
|
||||
it('simple handler gets called', function(cb) {
|
||||
var f = new Funnel();
|
||||
f.register(FooEvent, function(e) {
|
||||
e.x.should.equal(foo.x);
|
||||
cb();
|
||||
});
|
||||
f.process(foo);
|
||||
});
|
||||
it('other event does not get called', function() {
|
||||
var f = new Funnel();
|
||||
var spy = sinon.spy();
|
||||
f.register(FooEvent, spy);
|
||||
f.process(bar);
|
||||
spy.callCount.should.equal(0);
|
||||
});
|
||||
it('foo returns bar', function(cb) {
|
||||
var f = new Funnel();
|
||||
f.register(FooEvent, function(e) {
|
||||
var b = new BarEvent();
|
||||
b.y = e.x;
|
||||
return [b];
|
||||
});
|
||||
f.register(BarEvent, function(e) {
|
||||
e.y.should.equal(foo.x);
|
||||
cb();
|
||||
});
|
||||
f.process(foo);
|
||||
});
|
||||
it('foo returns two bars', function() {
|
||||
var f = new Funnel();
|
||||
var spy = sinon.spy();
|
||||
f.register(FooEvent, function() {
|
||||
var b1 = new BarEvent();
|
||||
var b2 = new BarEvent();
|
||||
return [b1, b2];
|
||||
});
|
||||
f.register(BarEvent, spy);
|
||||
f.process(foo);
|
||||
spy.callCount.should.equal(2);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user