export type Subscription = { unsubscribe: () => void; }; export type Observer = (value: T) => void; export class Subject { private observers: Set> = new Set(); next(value: T): void { for (const observer of this.observers) { observer(value); } } subscribe(observer: Observer): Subscription { this.observers.add(observer); return { unsubscribe: () => { this.observers.delete(observer); }, }; } complete(): void { this.observers.clear(); } } export class BehaviorSubject extends Subject { constructor(private currentValue: T) { super(); } override next(value: T): void { this.currentValue = value; super.next(value); } subscribe(observer: Observer): Subscription { observer(this.currentValue); return super.subscribe(observer); } getValue(): T { return this.currentValue; } }