import { BehaviorSubject, Observable, pairwise, Subscription } from 'rxjs'; export abstract class ScopesServiceBase { private _state: BehaviorSubject; protected constructor(initialState: T) { this._state = new BehaviorSubject(Object.freeze(initialState)); } public get state(): T { return this._state.getValue(); } public get stateObservable(): Observable { return this._state.asObservable(); } public subscribeToState = (cb: (newState: T, prevState: T) => void): Subscription => { return this._state.pipe(pairwise()).subscribe(([prevState, newState]) => cb(newState, prevState)); }; protected updateState = (newState: Partial) => { this._state.next(Object.freeze({ ...this.state, ...newState })); }; }