function CatEmitter() { } CatEmitter.prototype._listeners = {}; CatEmitter.prototype.on = function(name, cb) { if (!this._listeners[name]) this._listeners[name] = []; for (let i = 0; i < this._listeners[name].length; i++) { if (this._listeners[name][i] === cb) return false; // already exists } this._listeners[name].push(cb); return true; } CatEmitter.prototype.removeListener = function(name, cb) { if (!this._listeners[name]) return; for (let i = 0; i < this._listeners[name].length; i++) { if (this._listeners[name][i] === cb) { this._listeners[name].splice(i, 1); return true; } } return false; } CatEmitter.prototype.emit = function(name, data) { if (!this._listeners[name]) return; for (let i = 0; i < this._listeners[name].length; i++) { if (this._listeners[name][i](data) === false) return false; // exit early if false is returned } return true; } module.exports = CatEmitter;