138 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// 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;
 | 
						|
 | 
						|
})();
 |