1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2025-01-14 14:43:17 +08:00
2022-04-14 14:36:56 +02:00

54 lines
1.3 KiB
TypeScript

export class Event<T> {
protected handlers: ((data?: T) => void)[] = [];
protected singleHandlers: ((data?: T) => void)[] = [];
public on(handler: (data?: T) => void): void {
if (typeof handler !== 'function') {
throw new Error('Event::on: Handler is not a function');
}
this.handlers.push(handler);
}
public once(handler: (data?: T) => void): void {
if (typeof handler !== 'function') {
throw new Error('Event::once: Handler is not a function');
}
this.singleHandlers.push(handler);
}
public wait(): Promise<void> {
return new Promise<void>((resolve) => {
this.once(() => {
resolve();
});
});
}
public off(handler: (data?: T) => void): void {
this.handlers = this.handlers.filter((h) => h !== handler);
this.singleHandlers = this.singleHandlers.filter((h) => h !== handler);
}
public allOff(): void {
this.handlers = [];
this.singleHandlers = [];
}
public trigger(data?: T): void {
if (this.handlers) {
this.handlers.slice(0).forEach((h) => h(data));
}
if (this.singleHandlers) {
this.singleHandlers.slice(0).forEach((h) => h(data));
this.singleHandlers = [];
}
}
public hasListener(): boolean {
return this.handlers.length !== 0 || this.singleHandlers.length !== 0;
}
}