type LazyValue = T | (() => T); export function createCachedLazyValueGetter(value: LazyValue): () => T; export function createCachedLazyValueGetter( value: LazyValue, fallback: T, ): () => T; export function createCachedLazyValueGetter( value: LazyValue, fallback?: T, ): () => T | undefined { let resolved = false; let cached: T | undefined; return () => { if (!resolved) { const nextValue = typeof value === "function" ? (value as () => T | null | undefined)() : value; cached = nextValue ?? fallback; resolved = true; } return cached; }; }