Skip to content

Instantly share code, notes, and snippets.

@kiprasmel
Last active August 30, 2022 02:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kiprasmel/75de24e48c8c442e55d4771768d7ba49 to your computer and use it in GitHub Desktop.
Save kiprasmel/75de24e48c8c442e55d4771768d7ba49 to your computer and use it in GitHub Desktop.
/**
* https://gist.github.com/kiprasmel/75de24e48c8c442e55d4771768d7ba49
*/
export type Cb = () => void;
export class EventEmitter<Event extends string> {
listeners: Map<Event, Cb[]> = new Map();
/**
* can be used directly inside useEffect's `return`,
* because returns the cleanup fn.
*/
addEventListener(event: Event, cb: Cb): Cb {
const callbacks: Cb[] = this.listeners.get(event) || [];
callbacks.push(cb);
this.listeners.set(event, callbacks);
const cleanup = () => this.removeEventListener(event, cb);
return cleanup;
}
removeEventListener(event: Event, removableCb: Cb): void {
const callbacks: Cb[] | undefined = this.listeners.get(event);
if (!callbacks) return;
const newCallbacks = callbacks.filter((cb) => cb !== removableCb);
this.listeners.set(event, newCallbacks);
}
emit(event: Event): void {
const cbs: Cb[] = this.listeners.get(event) || [];
for (const cb of cbs) {
cb();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment