import { createReactiveCache, getReactiveCacheListenerSize, ReactiveCacheListener, setReactiveCacheValue, subscribeReactiveCache, } from './reactive-cache'; export interface MutationPending { data: Promise; status: 'pending'; } export interface MutationSuccess { data: T; status: 'success'; } export interface MutationFailure { data: any; status: 'failure'; } export type MutationResult = | MutationPending | MutationSuccess | MutationFailure; export interface Mutation { result: MutationResult; timestamp: number; isValidating: boolean; } export const MUTATION_CACHE = createReactiveCache>(); export type MutationListener = ReactiveCacheListener>; export function subscribeMutation( key: string, listener: MutationListener, ): () => void { return subscribeReactiveCache(MUTATION_CACHE, key, listener); } export function setMutation( key: string, value: Mutation, ): void { setReactiveCacheValue(MUTATION_CACHE, key, value); } export function getMutation( key: string, ): Mutation | undefined { const result = MUTATION_CACHE.cache.get(key); if (result) { return result.value; } return undefined; } export function getMutationListenerSize( key: string, ): number { return getReactiveCacheListenerSize(MUTATION_CACHE, key); }