You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.4 KiB
137 lines
3.4 KiB
// Generated by CoffeeScript 1.6.3 |
|
var Emitter, array; |
|
|
|
array = require('./array'); |
|
|
|
module.exports = Emitter = (function() { |
|
function Emitter() { |
|
this._listeners = {}; |
|
this._listenersForAnyEvent = []; |
|
this._disabledEmitters = {}; |
|
} |
|
|
|
Emitter.prototype.on = function(eventName, listener) { |
|
if (this._listeners[eventName] == null) { |
|
this._listeners[eventName] = []; |
|
} |
|
this._listeners[eventName].push(listener); |
|
return this; |
|
}; |
|
|
|
Emitter.prototype.once = function(eventName, listener) { |
|
var cb, ran, |
|
_this = this; |
|
ran = false; |
|
cb = function() { |
|
if (ran) { |
|
return; |
|
} |
|
ran = true; |
|
listener(); |
|
return setTimeout(function() { |
|
return _this.removeEvent(eventName, cb); |
|
}, 0); |
|
}; |
|
this.on(eventName, cb); |
|
return this; |
|
}; |
|
|
|
Emitter.prototype.onAnyEvent = function(listener) { |
|
this._listenersForAnyEvent.push(listener); |
|
return this; |
|
}; |
|
|
|
Emitter.prototype.removeEvent = function(eventName, listener) { |
|
if (this._listeners[eventName] == null) { |
|
return this; |
|
} |
|
array.pluckOneItem(this._listeners[eventName], listener); |
|
return this; |
|
}; |
|
|
|
Emitter.prototype.removeListeners = function(eventName) { |
|
if (this._listeners[eventName] == null) { |
|
return this; |
|
} |
|
this._listeners[eventName].length = 0; |
|
return this; |
|
}; |
|
|
|
Emitter.prototype.removeAllListeners = function() { |
|
var listeners, name, _ref; |
|
_ref = this._listeners; |
|
for (name in _ref) { |
|
listeners = _ref[name]; |
|
listeners.length = 0; |
|
} |
|
return this; |
|
}; |
|
|
|
Emitter.prototype._emit = function(eventName, data) { |
|
var listener, _i, _j, _len, _len1, _ref, _ref1; |
|
_ref = this._listenersForAnyEvent; |
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) { |
|
listener = _ref[_i]; |
|
listener.call(this, data, eventName); |
|
} |
|
if (this._listeners[eventName] == null) { |
|
return; |
|
} |
|
_ref1 = this._listeners[eventName]; |
|
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { |
|
listener = _ref1[_j]; |
|
listener.call(this, data); |
|
} |
|
}; |
|
|
|
Emitter.prototype._throttleEmitterMethod = function(fnName, time) { |
|
var lastCallArgs, originalFn, pend, pending, runIt, timer, |
|
_this = this; |
|
if (time == null) { |
|
time = 1000; |
|
} |
|
originalFn = this[fnName]; |
|
if (typeof originalFn !== 'function') { |
|
throw Error("this class does not have a method called '" + fnName + "'"); |
|
} |
|
lastCallArgs = null; |
|
pending = false; |
|
timer = null; |
|
this[fnName] = function() { |
|
lastCallArgs = arguments; |
|
return pend(); |
|
}; |
|
pend = function() { |
|
if (pending) { |
|
clearTimeout(timer); |
|
} |
|
timer = setTimeout(runIt, time); |
|
return pending = true; |
|
}; |
|
return runIt = function() { |
|
pending = false; |
|
return originalFn.apply(_this, lastCallArgs); |
|
}; |
|
}; |
|
|
|
Emitter.prototype._disableEmitter = function(fnName) { |
|
if (this._disabledEmitters[fnName] != null) { |
|
throw Error("" + fnName + " is already a disabled emitter"); |
|
} |
|
this._disabledEmitters[fnName] = this[fnName]; |
|
return this[fnName] = function() {}; |
|
}; |
|
|
|
Emitter.prototype._enableEmitter = function(fnName) { |
|
var fn; |
|
fn = this._disabledEmitters[fnName]; |
|
if (fn == null) { |
|
throw Error("" + fnName + " is not a disabled emitter"); |
|
} |
|
this[fnName] = fn; |
|
return delete this._disabledEmitters[fnName]; |
|
}; |
|
|
|
return Emitter; |
|
|
|
})();
|
|
|