import { Subject } from './Subject'; import { Subscriber } from './Subscriber'; import { Subscription } from './Subscription'; import { SubscriptionLike } from './types'; import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError'; /** * 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(); } /** @deprecated This is an internal implementation detail, do not use. */ _subscribe(subscriber: Subscriber): Subscription { const subscription = super._subscribe(subscriber); if (subscription && !(subscription).closed) { subscriber.next(this._value); } return subscription; } getValue(): T { if (this.hasError) { throw this.thrownError; } else if (this.closed) { throw new ObjectUnsubscribedError(); } else { return this._value; } } next(value: T): void { super.next(this._value = value); } }