summaryrefslogtreecommitdiffhomepage
path: root/packages/console/core/src/util/memo.ts
blob: 49043010f7336c530c5bbc3305b9063648115e25 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
export function memo<T>(fn: () => T, cleanup?: (input: T) => Promise<void>) {
  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
}