| import { Subject } from './Subject'; | 
| import { Subscriber } from './Subscriber'; | 
|   | 
| /** | 
|  * A variant of Subject that only emits a value when it completes. It will emit | 
|  * its latest value to all its observers on completion. | 
|  * | 
|  * @class AsyncSubject<T> | 
|  */ | 
| export class AsyncSubject<T> extends Subject<T> { | 
|   private _value: T | null = null; | 
|   private _hasValue = false; | 
|   private _isComplete = false; | 
|   | 
|   /** @internal */ | 
|   protected _checkFinalizedStatuses(subscriber: Subscriber<T>) { | 
|     const { hasError, _hasValue, _value, thrownError, isStopped, _isComplete } = this; | 
|     if (hasError) { | 
|       subscriber.error(thrownError); | 
|     } else if (isStopped || _isComplete) { | 
|       _hasValue && subscriber.next(_value!); | 
|       subscriber.complete(); | 
|     } | 
|   } | 
|   | 
|   next(value: T): void { | 
|     if (!this.isStopped) { | 
|       this._value = value; | 
|       this._hasValue = true; | 
|     } | 
|   } | 
|   | 
|   complete(): void { | 
|     const { _hasValue, _value, _isComplete } = this; | 
|     if (!_isComplete) { | 
|       this._isComplete = true; | 
|       _hasValue && super.next(_value!); | 
|       super.complete(); | 
|     } | 
|   } | 
| } |