import FakeMap from "../es6/loose/Map/index"; interface CacheOptions { isAsync?: boolean; resolver?(...a: unknown[]): string | number | symbol; } const defaultOptions: CacheOptions = { isAsync: false, resolver(args: Array) { return String(args[0]); }, }; interface UnknownFunction { (...a: unknown[]): T; } export function cache( func: UnknownFunction>, options?: CacheOptions ): UnknownFunction> { options = options || {}; const resolver = options.resolver || defaultOptions.resolver; const cachedResults = new FakeMap(); const isAsync = options.isAsync || defaultOptions.isAsync; function cached(...a: unknown[]): T | Promise; function cached(): T | Promise { const argsArray = [].slice.call(arguments); const key = (resolver as any)(argsArray); const ret = cachedResults.get(key); if (ret) return ret; const result = func.apply(null, argsArray); if (!isAsync) { cachedResults.set(key, result as T); return result; } return (result as Promise).then((value) => { cachedResults.set(key, value as T); return value; }); } cached._Map = cachedResults; return cached; }