memo.ts 392 B

123456789101112131415161718
  1. export function memo<T>(fn: () => T, cleanup?: (input: T) => Promise<void>) {
  2. let value: T | undefined
  3. let loaded = false
  4. const result = (): T => {
  5. if (loaded) return value as T
  6. loaded = true
  7. value = fn()
  8. return value as T
  9. }
  10. result.reset = async () => {
  11. if (cleanup && value) await cleanup(value)
  12. loaded = false
  13. value = undefined
  14. }
  15. return result
  16. }