installed pty
[VSoRC/.git] / node_modules / node-pty / src / eventEmitter2.ts
1 /**
2  * Copyright (c) 2019, Microsoft Corporation (MIT License).
3  */
4
5 import { IDisposable } from './types';
6
7 interface IListener<T> {
8   (e: T): void;
9 }
10
11 export interface IEvent<T> {
12   (listener: (e: T) => any): IDisposable;
13 }
14
15 export class EventEmitter2<T> {
16   private _listeners: IListener<T>[] = [];
17   private _event?: IEvent<T>;
18
19   public get event(): IEvent<T> {
20     if (!this._event) {
21       this._event = (listener: (e: T) => any) => {
22         this._listeners.push(listener);
23         const disposable = {
24           dispose: () => {
25             for (let i = 0; i < this._listeners.length; i++) {
26               if (this._listeners[i] === listener) {
27                 this._listeners.splice(i, 1);
28                 return;
29               }
30             }
31           }
32         };
33         return disposable;
34       };
35     }
36     return this._event;
37   }
38
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]);
43     }
44     for (let i = 0; i < queue.length; i++) {
45       queue[i].call(undefined, data);
46     }
47   }
48 }