@@ -56,13 +56,16 @@ export class Emitter<T> {
56
56
57
57
private static readonly _noop = function ( ) { } ;
58
58
59
- private _event : Event < T > ;
59
+ private _event : Event < T > | null ;
60
60
private _disposed : boolean ;
61
- private _deliveryQueue : [ Listener , T ] [ ] ;
62
- protected _listeners : LinkedList < Listener > ;
63
-
64
- constructor ( private _options ?: EmitterOptions ) {
65
-
61
+ private _deliveryQueue : [ Listener , ( T | undefined ) ] [ ] | null ;
62
+ protected _listeners : LinkedList < Listener > | null ;
63
+
64
+ constructor ( private _options : EmitterOptions | null = null ) {
65
+ this . _event = null ;
66
+ this . _disposed = false ;
67
+ this . _deliveryQueue = null ;
68
+ this . _listeners = null ;
66
69
}
67
70
68
71
/**
@@ -98,8 +101,11 @@ export class Emitter<T> {
98
101
result . dispose = Emitter . _noop ;
99
102
if ( ! this . _disposed ) {
100
103
remove ( ) ;
101
- if ( this . _options && this . _options . onLastListenerRemove && this . _listeners . isEmpty ( ) ) {
102
- this . _options . onLastListenerRemove ( this ) ;
104
+ if ( this . _options && this . _options . onLastListenerRemove ) {
105
+ const hasListeners = ( this . _listeners && ! this . _listeners . isEmpty ( ) ) ;
106
+ if ( ! hasListeners ) {
107
+ this . _options . onLastListenerRemove ( this ) ;
108
+ }
103
109
}
104
110
}
105
111
}
@@ -133,7 +139,7 @@ export class Emitter<T> {
133
139
}
134
140
135
141
while ( this . _deliveryQueue . length > 0 ) {
136
- const [ listener , event ] = this . _deliveryQueue . shift ( ) ;
142
+ const [ listener , event ] = this . _deliveryQueue . shift ( ) ! ;
137
143
try {
138
144
if ( typeof listener === 'function' ) {
139
145
listener . call ( undefined , event ) ;
@@ -149,7 +155,7 @@ export class Emitter<T> {
149
155
150
156
dispose ( ) {
151
157
if ( this . _listeners ) {
152
- this . _listeners = undefined ;
158
+ this . _listeners = null ;
153
159
}
154
160
if ( this . _deliveryQueue ) {
155
161
this . _deliveryQueue . length = 0 ;
@@ -184,7 +190,7 @@ export class AsyncEmitter<T extends IWaitUntil> extends Emitter<T> {
184
190
}
185
191
186
192
while ( this . _asyncDeliveryQueue . length > 0 ) {
187
- const [ listener , event , thenables ] = this . _asyncDeliveryQueue . shift ( ) ;
193
+ const [ listener , event , thenables ] = this . _asyncDeliveryQueue . shift ( ) ! ;
188
194
try {
189
195
if ( typeof listener === 'function' ) {
190
196
listener . call ( undefined , event ) ;
@@ -208,7 +214,7 @@ export class EventMultiplexer<T> implements IDisposable {
208
214
209
215
private readonly emitter : Emitter < T > ;
210
216
private hasListeners = false ;
211
- private events : { event : Event < T > ; listener : IDisposable ; } [ ] = [ ] ;
217
+ private events : { event : Event < T > ; listener : IDisposable | null ; } [ ] = [ ] ;
212
218
213
219
constructor ( ) {
214
220
this . emitter = new Emitter < T > ( {
@@ -251,12 +257,14 @@ export class EventMultiplexer<T> implements IDisposable {
251
257
this . events . forEach ( e => this . unhook ( e ) ) ;
252
258
}
253
259
254
- private hook ( e : { event : Event < T > ; listener : IDisposable ; } ) : void {
260
+ private hook ( e : { event : Event < T > ; listener : IDisposable | null ; } ) : void {
255
261
e . listener = e . event ( r => this . emitter . fire ( r ) ) ;
256
262
}
257
263
258
- private unhook ( e : { event : Event < T > ; listener : IDisposable ; } ) : void {
259
- e . listener . dispose ( ) ;
264
+ private unhook ( e : { event : Event < T > ; listener : IDisposable | null ; } ) : void {
265
+ if ( e . listener ) {
266
+ e . listener . dispose ( ) ;
267
+ }
260
268
e . listener = null ;
261
269
}
262
270
@@ -270,7 +278,7 @@ export function fromPromise<T =any>(promise: Thenable<T>): Event<T> {
270
278
let shouldEmit = false ;
271
279
272
280
promise
273
- . then ( null , ( ) => null )
281
+ . then ( undefined , ( ) => null )
274
282
. then ( ( ) => {
275
283
if ( ! shouldEmit ) {
276
284
setTimeout ( ( ) => emitter . fire ( ) , 0 ) ;
@@ -321,11 +329,11 @@ export function anyEvent<T>(...events: Event<T>[]): Event<T> {
321
329
}
322
330
323
331
export function debounceEvent < T > ( event : Event < T > , merger : ( last : T , event : T ) => T , delay ?: number , leading ?: boolean ) : Event < T > ;
324
- export function debounceEvent < I , O > ( event : Event < I > , merger : ( last : O , event : I ) => O , delay ?: number , leading ?: boolean ) : Event < O > ;
325
- export function debounceEvent < I , O > ( event : Event < I > , merger : ( last : O , event : I ) => O , delay : number = 100 , leading = false ) : Event < O > {
332
+ export function debounceEvent < I , O > ( event : Event < I > , merger : ( last : O | undefined , event : I ) => O , delay ?: number , leading ?: boolean ) : Event < O > ;
333
+ export function debounceEvent < I , O > ( event : Event < I > , merger : ( last : O | undefined , event : I ) => O , delay : number = 100 , leading = false ) : Event < O > {
326
334
327
335
let subscription : IDisposable ;
328
- let output : O = undefined ;
336
+ let output : O | undefined = undefined ;
329
337
let handle : any = undefined ;
330
338
let numDebouncedCalls = 0 ;
331
339
@@ -497,10 +505,10 @@ export function stopwatch<T>(event: Event<T>): Event<number> {
497
505
* // 4
498
506
* ```
499
507
*/
500
- export function buffer < T > ( event : Event < T > , nextTick = false , buffer : T [ ] = [ ] ) : Event < T > {
501
- buffer = buffer . slice ( ) ;
508
+ export function buffer < T > ( event : Event < T > , nextTick = false , _buffer : T [ ] = [ ] ) : Event < T > {
509
+ let buffer : T [ ] | null = _buffer . slice ( ) ;
502
510
503
- let listener = event ( e => {
511
+ let listener : IDisposable | null = event ( e => {
504
512
if ( buffer ) {
505
513
buffer . push ( e ) ;
506
514
} else {
@@ -509,7 +517,9 @@ export function buffer<T>(event: Event<T>, nextTick = false, buffer: T[] = []):
509
517
} ) ;
510
518
511
519
const flush = ( ) => {
512
- buffer . forEach ( e => emitter . fire ( e ) ) ;
520
+ if ( buffer ) {
521
+ buffer . forEach ( e => emitter . fire ( e ) ) ;
522
+ }
513
523
buffer = null ;
514
524
} ;
515
525
@@ -531,7 +541,9 @@ export function buffer<T>(event: Event<T>, nextTick = false, buffer: T[] = []):
531
541
} ,
532
542
533
543
onLastListenerRemove ( ) {
534
- listener . dispose ( ) ;
544
+ if ( listener ) {
545
+ listener . dispose ( ) ;
546
+ }
535
547
listener = null ;
536
548
}
537
549
} ) ;
0 commit comments