import { isFunction } from '../utils/utils.js';
/**
* Static EventManager for inter-component communication.
*
* @static
*
* @author rkoppe <roland.koppe@awi.de>
*/
export class EventManager {
static _listeners = {};
static _counter = 0;
/**
* Registers the given listener function for the event name.
*
* @static
* @param {string} name
* @param {function} listener
*/
static on(event, listener) {
if (!event || !listener) return;
if (!isFunction(listener)) return;
if (!(event in EventManager._listeners)) EventManager._listeners[event] = [];
listener.id = EventManager._counter++;
EventManager._listeners[event].push(listener);
return listener.id;
}
/**
* Fires an event with given name and payload.
*
* @static
* @param {string} name
* @param {object} payload
*/
static fire(event, payload) {
if (!(event in EventManager._listeners)) return;
let listeners = EventManager._listeners[event].slice();
for (let i = 0; i < listeners.length; i++) {
listeners[i].call(EventManager, payload);
}
}
/**
* Removes the given listener function for the event name.
*
* @static
* @param {string} name
* @param {function} listener
*/
static remove(event, listener) {
let listeners = EventManager._listeners[event];
if (!listeners) return;
let index = -1;
if (typeof listener == 'number') {
index = listeners.findIndex(l => l.id === listener);
} else {
index = listeners.indexOf(listener);
}
if (index >= 0) listeners.splice(index, 1);
}
}