import { Observable } from "rxjs"; import { DerivedStateDependencies } from "../../../types/state"; import { DeriveDefinition } from "../derive-definition"; import { DerivedState } from "../derived-state"; import { DerivedStateProvider } from "../derived-state.provider"; import { DefaultDerivedState } from "./default-derived-state"; export class DefaultDerivedStateProvider implements DerivedStateProvider { private cache: Record> = {}; constructor() {} get( parentState$: Observable, deriveDefinition: DeriveDefinition, dependencies: TDeps, ): DerivedState { const cacheKey = deriveDefinition.buildCacheKey(); const existingDerivedState = this.cache[cacheKey]; if (existingDerivedState != null) { // I have to cast out of the unknown generic but this should be safe if rules // around domain token are made return existingDerivedState as DefaultDerivedState; } const newDerivedState = this.buildDerivedState(parentState$, deriveDefinition, dependencies); this.cache[cacheKey] = newDerivedState; return newDerivedState; } protected buildDerivedState( parentState$: Observable, deriveDefinition: DeriveDefinition, dependencies: TDeps, ): DerivedState { return new DefaultDerivedState(parentState$, deriveDefinition, dependencies); } }