emitter remove

by Artem

Babel + JSX

'use strict';

function makeSubscription(fn, listeners, eventType) {
  const subscription = function(...args) {
    return fn.apply(this, args);
  };
  subscription.remove = function() {
    const idx = listeners[eventType].find(listener => listener === fn);
    listeners[eventType].splice(idx, 1);
  };
  return subscription;
}

const emitter = {
  listeners: {},
  addListener(eventType, callback) {
    const subscription = makeSubscription(callback, this.listeners, eventType);
    this.listeners[eventType] ?
      this.listeners[eventType].push(subscription) :
      this.listeners[eventType] = [subscription];
    return subscription;
  },
  emit(eventType) {
    this.listeners[eventType].forEach(listener => listener());
  }
};

const cb1 = emitter.addListener('change', function() {
  console.log('hello');
});
const cb2 = emitter.addListener('change', function() {
  console.log('bye');
});
emitter.emit('change');
cb1.remove();
emitter.emit('change');