Skip to content

Instantly share code, notes, and snippets.

@basarat
Created January 6, 2017 11:11
Show Gist options
  • Save basarat/46936dec14ad985bee24f54f3977cb2d to your computer and use it in GitHub Desktop.
Save basarat/46936dec14ad985bee24f54f3977cb2d to your computer and use it in GitHub Desktop.
export interface Listener<T> {
(event: T): any;
}
export interface Disposable {
dispose();
}
/** passes through events as they happen. You will not get events from before you start listening */
export class TypedEvent<T> {
private listeners: Listener<T>[] = [];
private listenersOncer: Listener<T>[] = [];
on = (listener: Listener<T>): Disposable => {
this.listeners.push(listener);
return {
dispose: () => this.off(listener)
};
}
once = (listener: Listener<T>): void => {
this.listenersOncer.push(listener);
}
off = (listener: Listener<T>) => {
var callbackIndex = this.listeners.indexOf(listener);
if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1);
}
emit = (event: T) => {
/** Update any general listeners */
this.listeners.forEach((listener) => listener(event));
/** Clear the `once` queue */
this.listenersOncer.forEach((listener) => listener(event));
this.listenersOncer = [];
}
pipe = (te: TypedEvent<T>): Disposable => {
return this.on((e) => te.emit(e));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment