export function memo(fn: () => T, cleanup?: (input: T) => Promise) { let value: T | undefined let loaded = false const result = (): T => { if (loaded) return value as T loaded = true value = fn() return value as T } result.reset = async () => { if (cleanup && value) await cleanup(value) loaded = false value = undefined } return result }