Created
May 2, 2024 08:53
-
-
Save FrameMuse/ac6365a035f6ce8c7673dc9af5fa1a75 to your computer and use it in GitHub Desktop.
EventEmitter - Super light weight, Simple and Powerful
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type EventEmitterListener = (...args: never[]) => void | |
class EventEmitter<Events extends Record<EventName, EventEmitterListener>, EventName extends keyof Events = keyof Events> { | |
private callbacks: Partial<Record<keyof never, Set<EventEmitterListener>>> = {} | |
public on<Event extends keyof Events>(event: Event, callback: Events[Event]) { | |
this.callbacks[event] ??= new Set | |
this.callbacks[event]?.add(callback as EventEmitterListener) | |
} | |
public off<Event extends keyof Events>(event: Event, callback: Events[Event]) { | |
this.callbacks[event]?.delete(callback as EventEmitterListener) | |
} | |
public emit<Event extends keyof Events>(event: Event, ...args: Parameters<Events[Event]>) { | |
const callbacks = this.callbacks[event] | |
if (callbacks == null) return | |
for (const callback of callbacks) callback(...args) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment