mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-04-14 12:46:05 +00:00
48 lines
1.1 KiB
TypeScript
48 lines
1.1 KiB
TypeScript
/**
|
|
* Copyright (c) 2019, Microsoft Corporation (MIT License).
|
|
*/
|
|
|
|
import { IDisposable } from './types';
|
|
|
|
interface IListener<T> {
|
|
(e: T): void;
|
|
}
|
|
|
|
export interface IEvent<T> {
|
|
(listener: (e: T) => any): IDisposable;
|
|
}
|
|
|
|
export class EventEmitter2<T> {
|
|
private _listeners: IListener<T>[] = [];
|
|
private _event?: IEvent<T>;
|
|
|
|
public get event(): IEvent<T> {
|
|
if (!this._event) {
|
|
this._event = (listener: (e: T) => any) => {
|
|
this._listeners.push(listener);
|
|
const disposable = {
|
|
dispose: () => {
|
|
for (let i = 0; i < this._listeners.length; i++) {
|
|
if (this._listeners[i] === listener) {
|
|
this._listeners.splice(i, 1);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
return disposable;
|
|
};
|
|
}
|
|
return this._event;
|
|
}
|
|
|
|
public fire(data: T): void {
|
|
const queue: IListener<T>[] = [];
|
|
for (let i = 0; i < this._listeners.length; i++) {
|
|
queue.push(this._listeners[i]);
|
|
}
|
|
for (let i = 0; i < queue.length; i++) {
|
|
queue[i].call(undefined, data);
|
|
}
|
|
}
|
|
}
|