const render = props.render; function EventEmitter() { let store = new Map(); let register = (persist, append) => (event, listener, isExclusive) => { isExclusive = !!isExclusive; if (typeof listener !== 'function') throw 'listener is not a function'; let listeners = store.get(event) || store.set(event, []).get(event); if ( listeners.length && (isExclusive || listeners.some((entry) => entry.isExclusive)) ) throw "Can't add listener to exclusive event"; listeners[append ? 'push' : 'unshift']({ persist, listener, isExclusive, }); }; return { on: register(true, false), once: register(false, false), prependListener: register(true, true), prependOnceListener: register(false, true), off: (event, listener) => { if (typeof listener !== 'function') throw 'listener is not a function'; let idx, listeners = store.get(event); if ( listeners && -1 < (idx = listeners.findIndex((entry) => entry.listener === listener)) ) { listeners.splice(idx, 1); if (!listeners.length) store.delete(event); } }, emit: (event, data) => { let listeners = store.get(event); if (listeners) { listeners = listeners.filter((entry) => { entry.listener(data); return entry.persist; }); if (!listeners.length) store.delete(event); else store.set(event, listeners); } }, }; } return render({ EventEmitter });