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 = {};

    /**
     * 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] = [];
        EventManager._listeners[event].push(listener);
    }

    /**
     * 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;
        listeners.remove(listener);
    }
}