Skip to content

Instantly share code, notes, and snippets.

@FrameMuse
Created May 2, 2024 08:53
Show Gist options
  • Save FrameMuse/ac6365a035f6ce8c7673dc9af5fa1a75 to your computer and use it in GitHub Desktop.
Save FrameMuse/ac6365a035f6ce8c7673dc9af5fa1a75 to your computer and use it in GitHub Desktop.
EventEmitter - Super light weight, Simple and Powerful
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