Skip to content

Instantly share code, notes, and snippets.

@abdessamadely
Created October 9, 2024 19:55
Show Gist options
  • Save abdessamadely/1b6c509eea2d85080ceba5ddd7f9ef27 to your computer and use it in GitHub Desktop.
Save abdessamadely/1b6c509eea2d85080ceba5ddd7f9ef27 to your computer and use it in GitHub Desktop.
A simple TypeScript idea for an event dispatcher
type Function = (data?: any) => void
const eventMap: Map<string, Function[]> = new Map()
function on(name: string, handler: Function) {
const handlers = eventMap.get(name) || []
handlers.push(handler)
eventMap.set(name, handlers)
}
function off(name: string, handler?: Function) {
if (handler) {
const handlers = (eventMap.get(name) || []).filter((h) => h === handler)
if (handlers.length) {
eventMap.set(name, handlers)
} else {
eventMap.delete(name)
}
} else {
eventMap.delete(name)
}
}
function trigger<T = any>(name: string, data?: T) {
const handlers = eventMap.get(name) || []
for (const handler of handlers) {
handler(data)
}
}
export const eventer = { on, off, trigger }
export type Eventer = typeof eventer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment