Add Executor and RelaySet
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
export type Deferred<T> = Promise<T> & {
|
||||
resolve: (arg: T) => void
|
||||
reject: (arg: T) => void
|
||||
}
|
||||
|
||||
export const defer = (): Deferred<any> => {
|
||||
let resolve, reject
|
||||
const p = new Promise((resolve_, reject_) => {
|
||||
resolve = resolve_
|
||||
reject = reject_
|
||||
})
|
||||
|
||||
return Object.assign(p, {resolve, reject}) as any
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
export type EventBusHandler = (...args: any[]) => void
|
||||
export type EventBusListener = {
|
||||
id: string
|
||||
handler: EventBusHandler
|
||||
}
|
||||
|
||||
export class EventBus {
|
||||
static ANY = Math.random().toString().slice(2)
|
||||
listeners: Record<string, Array<EventBusListener>> = {}
|
||||
on(name: string, handler: EventBusHandler) {
|
||||
const id = Math.random().toString().slice(2)
|
||||
|
||||
this.listeners[name] = this.listeners[name] || ([] as Array<EventBusListener>)
|
||||
this.listeners[name].push({id, handler})
|
||||
|
||||
return id
|
||||
}
|
||||
off(name: string, id: string) {
|
||||
this.listeners[name] = this.listeners[name].filter(l => l.id !== id)
|
||||
}
|
||||
clear() {
|
||||
this.listeners = {}
|
||||
}
|
||||
handle(k: string, ...payload: any) {
|
||||
for (const {handler} of this.listeners[k] || []) {
|
||||
handler(...payload)
|
||||
}
|
||||
|
||||
for (const {handler} of this.listeners[EventBus.ANY] || []) {
|
||||
handler(k, ...payload)
|
||||
}
|
||||
}
|
||||
pipe(k: string, bus: EventBus) {
|
||||
this.on(k, (...payload: any[]) => bus.handle(k, ...payload))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user