{"version":3,"sources":["../../src/use-memoize/index.ts"],"sourcesContent":["import { useCreation } from '../use-creation'\nimport { useLatest } from '../use-latest'\nimport { useStableFn } from '../use-stable-fn'\n\ntype CacheKey = PropertyKey\n\nexport interface UseMemoizeCache<Key, Value> {\n  get: (key: Key) => Value | undefined\n  set: (key: Key, value: Value) => void\n  has: (key: Key) => boolean\n  delete: (key: Key) => void\n  clear(): void\n}\n\nexport interface UseMemoizeOptions<Result, Args extends unknown[]> {\n  /**\n   * Custom cache key generator\n   *\n   * @defaultValue JSON.stringify(args)\n   */\n  getKey?: (...args: Args) => string | number\n  /**\n   * Custom cache, can be a Map or other object that implements the cache interface\n   *\n   * @defaultValue new Map()\n   */\n  cache?: UseMemoizeCache<CacheKey, Result>\n}\n\nexport interface UseMemoizeReturns<Result, Args extends unknown[]> {\n  /**\n   * Memoized function\n   */\n  (...args: Args): Result\n  /**\n   * Load data and replace the cache with the new value\n   */\n  load: (...args: Args) => Result\n  /**\n   * Delete cache by args\n   */\n  delete: (...args: Args) => void\n  /**\n   * Clear all cache\n   */\n  clear(): void\n  /**\n   * Get cache key by args\n   */\n  getKey: (...args: Args) => CacheKey\n  /**\n   * A map-like cache object, you can use it to manipulate the cache directly\n   */\n  cache: UseMemoizeCache<CacheKey, Result>\n}\n\n/**\n * A React Hook that return a function that memoize value (return same memoized value for same arguments).\n */\nexport function useMemoize<Result, Args extends unknown[]>(\n  resolver: (...args: Args) => Result,\n  options: UseMemoizeOptions<Result, Args> = {},\n): UseMemoizeReturns<Result, Args> {\n  const cache = useCreation((): UseMemoizeCache<CacheKey, Result> => {\n    if (options?.cache) return options.cache\n    return new Map<CacheKey, Result>()\n  }, [options?.cache])\n\n  const latest = useLatest({ ...options, cache })\n\n  const getKey = useStableFn((...args: Args) => {\n    const { getKey } = latest.current\n    return getKey ? getKey(...args) : JSON.stringify(args)\n  })\n\n  const _loadData = useStableFn((key: string | number, ...args: Args): Result => {\n    latest.current.cache.set(key, resolver(...args))\n    return latest.current.cache.get(key) as Result\n  })\n\n  const loadData = useStableFn((...args: Args) => _loadData(getKey(...args), ...args))\n\n  const deleteData = useStableFn((...args: Args) => {\n    latest.current.cache.delete(getKey(...args))\n  })\n\n  const clearData = useStableFn(() => cache.clear())\n\n  const memoized: Partial<UseMemoizeReturns<Result, Args>> = (...args: Args): Result => {\n    const key = getKey(...args)\n    if (latest.current.cache.has(key)) {\n      return latest.current.cache.get(key) as Result\n    }\n    return _loadData(key, ...args)\n  }\n\n  memoized.load = loadData\n  memoized.delete = deleteData\n  memoized.clear = clearData\n  memoized.getKey = getKey\n  memoized.cache = cache\n\n  return memoized as UseMemoizeReturns<Result, Args>\n}\n"],"names":["useMemoize","resolver","options","cache","useCreation","Map","latest","useLatest","getKey","useStableFn","args","current","JSON","stringify","_loadData","key","set","get","loadData","deleteData","delete","clearData","clear","memoized","has","load"],"mappings":";;;;+BA2DgBA;;;eAAAA;;;2BA3DY;yBACF;2BACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDrB,SAASA,WACdC,QAAmC;QACnCC,UAAAA,iEAA2C,CAAC;IAE5C,IAAMC,QAAQC,IAAAA,wBAAW,EAAC;QACxB,IAAIF,oBAAAA,8BAAAA,QAASC,KAAK,EAAE,OAAOD,QAAQC,KAAK;QACxC,OAAO,IAAIE;IACb,GAAG;QAACH,oBAAAA,8BAAAA,QAASC,KAAK;KAAC;IAEnB,IAAMG,SAASC,IAAAA,oBAAS,EAAC,wCAAKL;QAASC,OAAAA;;IAEvC,IAAMK,SAASC,IAAAA,wBAAW,EAAC;yCAAIC;YAAAA;;QAC7B,IAAM,AAAEF,SAAWF,OAAOK,OAAO,CAAzBH;QACR,OAAOA,SAASA,aAAAA,KAAAA,GAAO,qBAAGE,SAAQE,KAAKC,SAAS,CAACH;IACnD;IAEA,IAAMI,YAAYL,IAAAA,wBAAW,EAAC,SAACM;yCAAyBL;YAAAA;;QACtDJ,OAAOK,OAAO,CAACR,KAAK,CAACa,GAAG,CAACD,KAAKd,eAAAA,KAAAA,GAAS,qBAAGS;QAC1C,OAAOJ,OAAOK,OAAO,CAACR,KAAK,CAACc,GAAG,CAACF;IAClC;IAEA,IAAMG,WAAWT,IAAAA,wBAAW,EAAC;yCAAIC;YAAAA;;eAAeI,gBAAAA,KAAAA,GAAAA;YAAUN,aAAAA,KAAAA,GAAO,qBAAGE;SAAe,CAAnCI,OAA2B,qBAAGJ;;IAE9E,IAAMS,aAAaV,IAAAA,wBAAW,EAAC;yCAAIC;YAAAA;;QACjCJ,OAAOK,OAAO,CAACR,KAAK,CAACiB,MAAM,CAACZ,aAAAA,KAAAA,GAAO,qBAAGE;IACxC;IAEA,IAAMW,YAAYZ,IAAAA,wBAAW,EAAC;eAAMN,MAAMmB,KAAK;;IAE/C,IAAMC,WAAqD;yCAAIb;YAAAA;;QAC7D,IAAMK,MAAMP,aAAAA,KAAAA,GAAO,qBAAGE;QACtB,IAAIJ,OAAOK,OAAO,CAACR,KAAK,CAACqB,GAAG,CAACT,MAAM;YACjC,OAAOT,OAAOK,OAAO,CAACR,KAAK,CAACc,GAAG,CAACF;QAClC;QACA,OAAOD,gBAAAA,KAAAA,GAAAA;YAAUC;SAAa,CAAvBD,OAAe,qBAAGJ;IAC3B;IAEAa,SAASE,IAAI,GAAGP;IAChBK,SAASH,MAAM,GAAGD;IAClBI,SAASD,KAAK,GAAGD;IACjBE,SAASf,MAAM,GAAGA;IAClBe,SAASpB,KAAK,GAAGA;IAEjB,OAAOoB;AACT"}