{"version":3,"file":"index.cjs","sources":[""],"sourcesContent":["type TCacheNode = {\n  children: Map<unknown, TCacheNode>;\n  hasValue: boolean;\n  value?: unknown;\n};\n\nexport type TMemoizedFn<T extends (...args: any[]) => any> = ((\n  ...args: Parameters<T>\n) => ReturnType<T>) & {\n  clear: () => void;\n};\n\nexport type TGetMemoizedFnArgs = Parameters<typeof getMemoizedFn>;\n\nexport type TGetMemoizedFnReturn = ReturnType<typeof getMemoizedFn>;\n\nconst getCacheNode = (): TCacheNode => ({\n  children: new Map(),\n  hasValue: false,\n});\n\n/**\n * Memoizes a function by receiver and argument identity and exposes a cache reset method.\n * @template T\n * @param {T} fn Source function\n * @returns {TMemoizedFn<T>} Memoized function\n * @throws {TypeError} getMemoizedFn: fn must be a function\n * @example\n * const doubled = getMemoizedFn((value: number) => value * 2);\n * doubled(2); // 4\n * doubled.clear();\n * @example\n * // Cache an expensive product filter until its argument identities change\n * const filterProducts = getMemoizedFn((items, filters) => {\n *   return items.filter((item) => filters.includes(item.category));\n * });\n */\nexport const getMemoizedFn = <T extends (...args: any[]) => any>(fn: T): TMemoizedFn<T> => {\n  if (typeof fn !== \"function\") {\n    throw new TypeError(\"getMemoizedFn: fn must be a function\");\n  }\n\n  let root = getCacheNode();\n  const memoized = function memoizedFunction(\n    this: unknown,\n    ...args: Parameters<T>\n  ): ReturnType<T> {\n    let node = root;\n    [ this, ...args ].forEach((cacheKey) => {\n      let child = node.children.get(cacheKey);\n      if (!child) {\n        child = getCacheNode();\n        node.children.set(cacheKey, child);\n      }\n      node = child;\n    });\n    if (!node.hasValue) {\n      node.value = fn.apply(this, args);\n      node.hasValue = true;\n    }\n    return node.value as ReturnType<T>;\n  } as TMemoizedFn<T>;\n\n  memoized.clear = (): void => {\n    root = getCacheNode();\n  };\n  return memoized;\n};\n"],"names":["getCacheNode","children","Map","hasValue","getMemoizedFn","fn","TypeError","root","memoized","memoizedFunction","args","node","this","forEach","cacheKey","child","get","set","value","apply","clear"],"mappings":"yDAgBA,MAAMA,aAAe,KAAA,CACnBC,SAAU,IAAIC,IACdC,SAAU,QAmBL,MAAMC,cAAoDC,KAC/D,UAAWA,KAAO,WAChB,MAAM,IAAIC,UAAU,wCAGtB,IAAIC,KAAOP,eACX,MAAMQ,SAAW,SAASC,oBAErBC,MAEH,IAAIC,KAAOJ,KACX,CAAEK,QAASF,MAAOG,QAASC,WACzB,IAAIC,MAAQJ,KAAKV,SAASe,IAAIF,UAC9B,IAAKC,MAAO,CACVA,MAAQf,eACRW,KAAKV,SAASgB,IAAIH,SAAUC,MAC9B,CACAJ,KAAOI,QAET,IAAKJ,KAAKR,SAAU,CAClBQ,KAAKO,MAAQb,GAAGc,MAAMP,KAAMF,MAC5BC,KAAKR,SAAW,IAClB,CACA,OAAOQ,KAAKO,KACd,EAEAV,SAASY,MAAQ,KACfb,KAAOP,gBAET,OAAOQ"}