/** | |
* 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); | |
} | |
} | |
} | |