import { CovarianceGuard, Defined } from '../utils/type-utils'; import { WireId } from '../utils/wire-id'; export interface ReadonlyStateWireGuard { ' state-wire': CovarianceGuard; } export interface ReadonlyStateWire extends ReadonlyStateWireGuard, WireId { /** * get current value * @returns current value */ getValue(): V; /** * subscribe for value change * @param callback - * @returns unsubscribe function */ subscribe(callback: (value: Defined) => void): () => void; } export function isReadonlyStateWire( wire: unknown, ): wire is ReadonlyStateWire { return !!( wire && (wire as any)[' state-wire'] && (wire as any)[' state-wire'][0] ); } export function createReadonlyStateWireGuard(): ReadonlyStateWireGuard { return { ' state-wire': [true /* read */, false /* write */] as any }; } export type WireState> = W extends ReadonlyStateWire ? V : never;