xterm
[VSoRC/.git] / node_modules / xterm / src / common / EventEmitter.ts
1 /**
2  * Copyright (c) 2019 The xterm.js authors. All rights reserved.
3  * @license MIT
4  */
5
6 import { IDisposable } from 'common/Types';
7
8 interface IListener<T> {
9   (e: T): void;
10 }
11
12 export interface IEvent<T> {
13   (listener: (e: T) => any): IDisposable;
14 }
15
16 export interface IEventEmitter<T> {
17   event: IEvent<T>;
18   fire(data: T): void;
19 }
20
21 export class EventEmitter<T> implements IEventEmitter<T> {
22   private _listeners: IListener<T>[] = [];
23   private _event?: IEvent<T>;
24
25   public get event(): IEvent<T> {
26     if (!this._event) {
27       this._event = (listener: (e: T) => any) => {
28         this._listeners.push(listener);
29         const disposable = {
30           dispose: () => {
31             for (let i = 0; i < this._listeners.length; i++) {
32               if (this._listeners[i] === listener) {
33                 this._listeners.splice(i, 1);
34                 return;
35               }
36             }
37           }
38         };
39         return disposable;
40       };
41     }
42     return this._event;
43   }
44
45   public fire(data: T): void {
46     const queue: IListener<T>[] = [];
47     for (let i = 0; i < this._listeners.length; i++) {
48       queue.push(this._listeners[i]);
49     }
50     for (let i = 0; i < queue.length; i++) {
51       queue[i].call(undefined, data);
52     }
53   }
54 }