2 * Copyright (c) 2019, Microsoft Corporation (MIT License).
5 import { IDisposable } from './types';
7 interface IListener<T> {
11 export interface IEvent<T> {
12 (listener: (e: T) => any): IDisposable;
15 export class EventEmitter2<T> {
16 private _listeners: IListener<T>[] = [];
17 private _event?: IEvent<T>;
19 public get event(): IEvent<T> {
21 this._event = (listener: (e: T) => any) => {
22 this._listeners.push(listener);
25 for (let i = 0; i < this._listeners.length; i++) {
26 if (this._listeners[i] === listener) {
27 this._listeners.splice(i, 1);
39 public fire(data: T): void {
40 const queue: IListener<T>[] = [];
41 for (let i = 0; i < this._listeners.length; i++) {
42 queue.push(this._listeners[i]);
44 for (let i = 0; i < queue.length; i++) {
45 queue[i].call(undefined, data);