/* eslint-disable no-redeclare */ interface Cache { set(key: K, value: V, maxAge?: number): boolean get(key: K): V | undefined del(key: K): void } export function withPromiseCache( cache: Cache>, fn: (value: K) => Promise ): (value: K) => Promise export function withPromiseCache( cache: Cache>, fn: (...values: T) => Promise, getKey: (...values: T) => K ): (...values: T) => Promise export function withPromiseCache( cache: Cache>, fn: (...values: T) => Promise, getKey?: (...values: T) => K ): (...values: T) => Promise { return (...values: T) => { const key = getKey ? getKey(...values) : values[0] let p = cache.get(key) if (!p) { p = fn(...values) p.catch(() => cache.del(key)) cache.set(key, p) } return p } }