1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-21 11:54:02 +00:00
Files
browser/libs/state-internal/src/inline-derived-state.ts
2025-12-29 15:53:52 +01:00

42 lines
1.1 KiB
TypeScript

import { Observable, concatMap } from "rxjs";
import {
DeriveDefinition,
DerivedState,
DerivedStateDependencies,
DerivedStateProvider,
} from "@bitwarden/state";
export class InlineDerivedStateProvider implements DerivedStateProvider {
get<TFrom, TTo, TDeps extends DerivedStateDependencies>(
parentState$: Observable<TFrom>,
deriveDefinition: DeriveDefinition<TFrom, TTo, TDeps>,
dependencies: TDeps,
): DerivedState<TTo> {
return new InlineDerivedState(parentState$, deriveDefinition, dependencies);
}
}
export class InlineDerivedState<
TFrom,
TTo,
TDeps extends DerivedStateDependencies,
> implements DerivedState<TTo> {
constructor(
parentState$: Observable<TFrom>,
deriveDefinition: DeriveDefinition<TFrom, TTo, TDeps>,
dependencies: TDeps,
) {
this.state$ = parentState$.pipe(
concatMap(async (value) => await deriveDefinition.derive(value, dependencies)),
);
}
state$: Observable<TTo>;
forceValue(value: TTo): Promise<TTo> {
// No need to force anything, we don't keep a cache
return Promise.resolve(value);
}
}