{"version":3,"file":"angular-kit-cdk-memoize.mjs","sources":["../../../../libs/cdk/memoize/src/lib/memoize.ts","../../../../libs/cdk/memoize/src/angular-kit-cdk-memoize.ts"],"sourcesContent":["/**\n * Memoize decorator\n * @example\n *\n * class Test {\n  @Memoize()\n  calculate(a: number, b: number): number {\n    return a + b;\n  }\n}\n */\nexport function Memoize() {\n  return function (\n    target: any,\n    propertyKey: string,\n    descriptor: PropertyDescriptor\n  ) {\n    const originalMethod = descriptor.value;\n    //wrapping the original method\n    descriptor.value = function (...args: any[]) {\n      const memoizer = memoize(originalMethod);\n      return memoizer.memoized(...args);\n    };\n  };\n}\n\n/**\n * Memoize a pure function and only recalculate if the arguments change.\n * @param projectionFn - the function to memoize\n * @param comparatorFn - a function to compare the arguments. By default an equality check (===) is used.\n *\n * @example\n * const memoizedFn = memoize((a, b) => a + b).memoized(a, b);\n */\nexport function memoize<T>(\n  projectionFn: ProjectionFn<T>,\n  comparatorFn?: ComparatorFn\n): MemoizedProjection<T> {\n  return resultMemoize(projectionFn, comparatorFn ?? defaultComparatorFn);\n}\n\nexport type ProjectionFn<T> = (...args: any[]) => T;\n\nexport type ComparatorFn = (a: any, b: any) => boolean;\n\nexport type MemoizedProjection<T> = {\n  memoized: ProjectionFn<T>;\n  reset: () => void;\n  setResult: (result?: T) => void;\n};\n\nfunction defaultComparatorFn(a: any, b: any): boolean {\n  if (a instanceof Array) {\n    return a.length === b.length && a.every((fromA) => b.includes(fromA));\n  }\n  // Default comparison\n  return a === b;\n}\n\nexport function isEqualCheck(a: any, b: any): boolean {\n  return a === b;\n}\n\nfunction isArgumentsChanged(\n  args: IArguments,\n  lastArguments: IArguments,\n  comparator: ComparatorFn\n) {\n  for (let i = 0; i < args.length; i++) {\n    if (!comparator(args[i], lastArguments[i])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction resultMemoize<T>(\n  projectionFn: ProjectionFn<T>,\n  isResultEqual: ComparatorFn\n) {\n  return defaultMemoize(projectionFn, isEqualCheck, isResultEqual);\n}\n\nfunction defaultMemoize<T>(\n  projectionFn: ProjectionFn<T>,\n  isArgumentsEqual = isEqualCheck,\n  isResultEqual = isEqualCheck\n): MemoizedProjection<T> {\n  let lastArguments: null | IArguments = null;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any, , , , ,\n  let lastResult: any = null;\n  let overrideResult: any;\n\n  function reset() {\n    lastArguments = null;\n    lastResult = null;\n    overrideResult = undefined;\n  }\n\n  function setResult(result: any = undefined) {\n    overrideResult = { result };\n  }\n\n  /* eslint-disable prefer-rest-params, prefer-spread */\n\n  // disabled because of the use of `arguments`\n  function memoized(): any {\n    if (overrideResult !== undefined) {\n      return overrideResult.result;\n    }\n\n    if (!lastArguments) {\n      lastResult = projectionFn.apply(null, arguments as any);\n      lastArguments = arguments;\n      return lastResult;\n    }\n\n    if (!isArgumentsChanged(arguments, lastArguments, isArgumentsEqual)) {\n      return lastResult;\n    }\n\n    const newResult = projectionFn.apply(null, arguments as any);\n    lastArguments = arguments;\n\n    if (isResultEqual(lastResult, newResult)) {\n      return lastResult;\n    }\n\n    lastResult = newResult;\n\n    return newResult;\n  }\n\n  return { memoized, reset, setResult };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}