const Grade = (function Grade() {
    const Emitter = (function Emitter() {
        const listeners = new Map();
        const add = function add(name, callback) {
            if(typeof name !== "string" || typeof callback !== "function" || name === "")
                return null;

            let id = Symbol();
            if(listeners.has(name)){
                listeners.get(name).push({ callback, id });
            }else{
                listeners.set(name, [{ callback, id }]);
            }
            return id;
        };
        const remove = function remove(name, id) {
            if(!listeners.has(name))
                return false;

            let found = false;
            listeners.get(name).forEach((e, i) => {
                if(e.id === id){
                    listeners.get(name).splice(i, 1);
                    found = true;
                }
            });
            return found;
        };
        const emit = function emit(name, data) {
            if(!listeners.has(name))
                return false;
            listeners.get(name).forEach(e => {
                e.callback(data);
            });
            return true;
        };

        return Object.freeze({
            add: (name, callback) => add(name, callback), 
            remove: (name, id) => remove(name, id), 
            emit: (name, data) => emit(name, data)
        });
    })();
})();