{"version":3,"file":"memoize.cjs","names":[],"sources":["../../src/function/memoize.ts"],"sourcesContent":["/**\n * Creates a function that memoizes the result of func.\n * If resolver is provided, it determines the cache key for storing the result\n * based on the arguments provided to the memoized function.\n *\n * @template T - The type of the function to memoize\n * @param func - The function to have its output memoized\n * @param resolver - The function to resolve the cache key (optional)\n * @returns Returns the new memoized function\n *\n * @example\n * const fibonacci = memoize((n: number): number => {\n *   if (n <= 1) return n;\n *   return fibonacci(n - 1) + fibonacci(n - 2);\n * });\n * fibonacci(10); // Calculates and caches\n * fibonacci(10); // Returns cached result\n *\n * @example\n * // With custom resolver\n * const memoized = memoize(\n *   (a: number, b: number) => a + b,\n *   (a: number, b: number) => `${a}-${b}`\n * );\n * memoized(1, 2); // => 3 (calculates)\n * memoized(1, 2); // => 3 (cached)\n */\nexport function memoize<T extends (...args: never[]) => unknown>(\n  func: T,\n  resolver?: (...args: Parameters<T>) => unknown,\n): T & { cache: Map<unknown, ReturnType<T>> } {\n  type Memoized = T & { cache: Map<unknown, ReturnType<T>> };\n\n  const cache = new Map<unknown, ReturnType<T>>();\n  const call = (thisArg: unknown, args: Parameters<T>): ReturnType<T> =>\n    (func as (this: unknown, ...args: Parameters<T>) => ReturnType<T>).apply(thisArg, args);\n\n  const memoized = function (this: unknown, ...args: Parameters<T>): ReturnType<T> {\n    const key = resolver ? resolver.apply(this as ThisParameterType<typeof resolver>, args) : args[0];\n\n    if (cache.has(key)) {\n      return cache.get(key)!;\n    }\n\n    const result = call(this, args);\n    cache.set(key, result);\n    return result;\n  } as Memoized;\n\n  memoized.cache = cache;\n\n  return memoized;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,QACd,MACA,UAC4C;CAG5C,MAAM,wBAAQ,IAAI,IAA4B;CAC9C,MAAM,QAAQ,SAAkB,SAC7B,KAAkE,MAAM,SAAS,IAAI;CAExF,MAAM,WAAW,SAAyB,GAAG,MAAoC;EAC/E,MAAM,MAAM,WAAW,SAAS,MAAM,MAA4C,IAAI,IAAI,KAAK;EAE/F,IAAI,MAAM,IAAI,GAAG,GACf,OAAO,MAAM,IAAI,GAAG;EAGtB,MAAM,SAAS,KAAK,MAAM,IAAI;EAC9B,MAAM,IAAI,KAAK,MAAM;EACrB,OAAO;CACT;CAEA,SAAS,QAAQ;CAEjB,OAAO;AACT"}