class EventEmitter {
	//--------------------------
	// constructor
	//--------------------------
	constructor() {
		this.listeners = new Map();
	}
	//--------------------------
	// methods
	//--------------------------
	addListener(label, callback) {
		this.listeners.has(label) || this.listeners.set(label, []);
		this.listeners.get(label).push(callback);
	}

	removeListener(label, callback) {
		var isFunction = function(obj) {
			return typeof obj == 'function' || false;
		};

		var listeners = this.listeners.get(label),
			index;

		if (listeners && listeners.length) {
			index = listeners.reduce((i, listener, index) => {
				return isFunction(listener) && listener === callback ? (i = index) : i;
			}, -1);

			if (index > -1) {
				listeners.splice(index, 1);
				this.listeners.set(label, listeners);
				return true;
			}
		}
		return false;
	}

	emitEvent(label, ...args) {
		var listeners = this.listeners.get(label);
		if (listeners && listeners.length) {
			listeners.forEach(listener => {
				listener(...args);
			});
			return true;
		}
		return false;
	}
	//--------------------------
	// event handlers
	//--------------------------
}
export default EventEmitter;
