From 59f87b7ea98fcc7b35235294a53796e13f2e5862 Mon Sep 17 00:00:00 2001 From: Andrey Fedorov Date: Mon, 5 Nov 2012 02:18:56 -0800 Subject: [PATCH] added local events library --- js/events.js | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 js/events.js diff --git a/js/events.js b/js/events.js new file mode 100644 index 00000000..09d0ce89 --- /dev/null +++ b/js/events.js @@ -0,0 +1,57 @@ +var EventEmitter = function () { + this._events = {}; +}; + +EventEmitter.prototype.on = function (e, f) { + console.log('on', e, f) + if (e in this._events) { + if (this._events[e].indexOf(f) < 0) { + this._events[e].push(f); + } + } else { + this._events[e] = [f]; + } + return this; +}; + +EventEmitter.prototype.off = function (e, f) { + if (f) { + function eq(x) { return function (y) { return x === y; } } + this._events[e] = this.listeners(e).filter(eq(f)); + } else { + delete this._events[e]; + } +}; + +EventEmitter.prototype.removeListener = function (e, f) { + this.off(e, f); +}; + +EventEmitter.prototype.removeAllListeners = function (e) { + this.off(e); +}; + +EventEmitter.prototype.emit = function (e) { + var args = Array.prototype.slice.call(arguments, 1), + fs = this.listeners(e); + console.log('emit', e, args) + + for (var i = 0; i < fs.length; i++) { + fs[i].apply(e, args); + } +}; + +EventEmitter.prototype.listeners = function (e) { + return this._events[e] || []; +}; + +EventEmitter.prototype.once = function (e, f) { + var that = this; + this.on(e, function g() { + f.apply(es, arguments); + that.off(e, g); + }); + return this; +}; + +exports.EventEmitter = EventEmitter; \ No newline at end of file