export default function eventify()

in src/lib/eventify.js [10:59]


export default function eventify(object: Object): Object {
    if (!object) {
        object = {};
    }

    assertObjectHasNoReservedKeywords(object);

    const listeners = new Map(); // eventName -> Set() of listeners

    object.on = on;
    object.off = off;
    object.trigger = trigger;

    return object;

    function on(eventName: string, callback: Function): void {
        let eventListeners = listeners.get(eventName);
        if (!eventListeners) {
            eventListeners = new Set();
            listeners.set(eventName, eventListeners);
        }

        eventListeners.add(callback);
    }

    function trigger(eventName: string, ...args): void {
        const eventListeners = listeners.get(eventName);
        if (eventListeners) {
            eventListeners.forEach(listener => listener.apply(null, args));
        }
    }

    function off(eventName: string, callback: Function): Object {
        if (!callback) {
            // we want to unsubscribe from all events
            listeners.delete(eventName);
            return object;
        }

        let eventListeners = listeners.get(eventName);
        if (!eventListeners) {
            // no listeners, nothing to unsubscribe from
            return object;
        }
        // remove this specific callback from this event
        eventListeners.delete(callback);

        return object;
    }
}