import { Subject } from './Subject'; import { Subscriber } from './Subscriber'; import { Subscription } from './Subscription'; /** * A variant of Subject that requires an initial value and emits its current * value whenever it is subscribed to. * * @class BehaviorSubject */ export class BehaviorSubject extends Subject { constructor(private _value: T) { super(); } get value(): T { return this.getValue(); } /** @internal */ protected _subscribe(subscriber: Subscriber): Subscription { const subscription = super._subscribe(subscriber); !subscription.closed && subscriber.next(this._value); return subscription; } getValue(): T { const { hasError, thrownError, _value } = this; if (hasError) { throw thrownError; } this._throwIfClosed(); return _value; } next(value: T): void { super.next((this._value = value)); } }