/**
 * Copyright (c) 2019, Microsoft Corporation (MIT License).
 */ import { IDisposable } from './types' ; interface IListener < T > { ( e ) : void ; } export interface IEvent < T > { ( listener ) : IDisposable ; } export class EventEmitter2 < T > { private _listeners : IListener < T > [ ] = [ ] ; private _event ? : IEvent < T > ; public get event ( ) : IEvent < T > { if ( ! this . _event ) { this . _event = ( listener ) => { 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 ) { const queue = [ ] ; 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 ) ; } } }