all files / src/ tiny-emitter.js

100% Statements 18/18
100% Branches 4/4
100% Functions 5/5
100% Lines 17/17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46    10×                                                      
class TinyEmitter {
  constructor() {
    Object.defineProperty(this, '__listeners', {
      value: {},
      enumerable: false,
      writable: false
    });
  }
 
  emit(eventName, ...args) {
    for(const handler of this.__listeners[eventName]) {
      handler(...args);
    }
 
    return this;
  }
 
  once(eventName, handler) {
    const once = (...args) => {
      this.off(eventName, once);
      handler(...args);
    };
 
    return this.on(eventName, once);
  }
 
  on(eventName, handler) {
    if(!this.__listeners[eventName])
      this.__listeners[eventName] = [];
 
    this.__listeners[eventName].push(handler);
 
    return this;
  }
 
  off(eventName, handler) {
    if(handler)
      this.__listeners[eventName] = this.__listeners[eventName].filter(h => h !== handler);
    else
      this.__listeners[eventName] = [];
 
    return this;
  }
}
 
module.exports = TinyEmitter;