2023-01-29 21:05:47 +00:00
|
|
|
import { Emitter, EmitterEvent, EmitterListener, EmitterListenerData, EmitterListeners } from "@types";
|
|
|
|
|
|
|
|
export const Events = Object.freeze({
|
2023-02-04 02:28:08 +00:00
|
|
|
GET: "GET",
|
|
|
|
SET: "SET",
|
|
|
|
DEL: "DEL",
|
2023-01-29 21:05:47 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
export default function createEmitter(): Emitter {
|
2023-02-04 02:28:08 +00:00
|
|
|
return {
|
|
|
|
listeners: Object.values(Events).reduce<EmitterListeners>((acc, val: string) => ((acc[val] = new Set<EmitterListener>()), acc), {}) as EmitterListeners,
|
2023-01-29 21:05:47 +00:00
|
|
|
|
2023-02-04 02:28:08 +00:00
|
|
|
on(event: EmitterEvent, listener: EmitterListener) {
|
|
|
|
if (!this.listeners[event].has(listener)) this.listeners[event].add(listener);
|
|
|
|
},
|
2023-01-29 21:05:47 +00:00
|
|
|
|
2023-02-04 02:28:08 +00:00
|
|
|
off(event: EmitterEvent, listener: EmitterListener) {
|
|
|
|
this.listeners[event].delete(listener);
|
|
|
|
},
|
2023-01-29 21:05:47 +00:00
|
|
|
|
2023-02-04 02:28:08 +00:00
|
|
|
once(event: EmitterEvent, listener: EmitterListener) {
|
|
|
|
const once = (event: EmitterEvent, data: EmitterListenerData) => {
|
|
|
|
this.off(event, once);
|
|
|
|
listener(event, data);
|
|
|
|
};
|
|
|
|
this.on(event, once);
|
|
|
|
},
|
2023-01-29 21:05:47 +00:00
|
|
|
|
2023-02-04 02:28:08 +00:00
|
|
|
emit(event: EmitterEvent, data: EmitterListenerData) {
|
|
|
|
for (const listener of this.listeners[event]) listener(event, data);
|
|
|
|
},
|
|
|
|
};
|
2023-01-29 21:05:47 +00:00
|
|
|
}
|