Source: events/EventManager.js

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);
    }
}