{"version":3,"file":"flex-controls-decorators.mjs","sources":["../../../../libs/flex-controls/decorators/pure.ts","../../../../libs/flex-controls/decorators/flex-controls-decorators.ts"],"sourcesContent":["/**\n * Implements lazy initialization for getter or memoization of a function call similar to pure {@link: Pipe}.\n * Replaces getter with its calculated value upon first call or keeps track of last call arguments and returned\n * value for function, skipping calculation when arguments are strictly the same.\n *\n * @throws error if used not on getter or function\n *\n * CAUTION: `this` is not available inside such functions/getters, they must be pure.\n */\nexport function flMakePure<T>(\n  // eslint-disable-next-line @typescript-eslint/ban-types\n  _target: Object,\n  propertyKey: string,\n  { get, enumerable, value }: TypedPropertyDescriptor<T>\n): TypedPropertyDescriptor<T> {\n  if (get) {\n    return {\n      enumerable,\n      get(): T {\n        // eslint-disable-next-line @typescript-eslint/typedef\n        const value = get.call(this);\n\n        Object.defineProperty(this, propertyKey, { enumerable, value });\n\n        return value;\n      }\n    };\n  }\n\n  if (typeof value !== \"function\") {\n    throw new Error(\"flPure can only be used with functions or getters\");\n  }\n\n  // eslint-disable-next-line @typescript-eslint/typedef\n  const original = value;\n\n  return {\n    enumerable,\n    get(): T {\n      let previousArgs: readonly unknown[] = [];\n      let previousResult: any;\n\n      // eslint-disable-next-line @typescript-eslint/typedef\n      const patched = (...args: unknown[]) => {\n        // eslint-disable-next-line @typescript-eslint/typedef\n        if (previousArgs.length === args.length && args.every((arg, index) => arg === previousArgs[index])) {\n          return previousResult;\n        }\n\n        previousArgs = args;\n        previousResult = original.apply(this, args);\n\n        return previousResult;\n      };\n\n      Object.defineProperty(this, propertyKey, {\n        value: patched\n      });\n\n      return patched as any;\n    }\n  };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;;;;;;;;AAQG;SACa,UAAU;AACxB;AACA,OAAe,EACf,WAAmB,EACnB,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAA8B,EAAA;AAEtD,IAAA,IAAI,GAAG,EAAE;QACP,OAAO;YACL,UAAU;YACV,GAAG,GAAA;;gBAED,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE7B,gBAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;AAEhE,gBAAA,OAAO,KAAK,CAAC;aACd;SACF,CAAC;AACH,KAAA;AAED,IAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,QAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;AACtE,KAAA;;IAGD,MAAM,QAAQ,GAAG,KAAK,CAAC;IAEvB,OAAO;QACL,UAAU;QACV,GAAG,GAAA;YACD,IAAI,YAAY,GAAuB,EAAE,CAAC;AAC1C,YAAA,IAAI,cAAmB,CAAC;;AAGxB,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAe,KAAI;;gBAErC,IAAI,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;AAClG,oBAAA,OAAO,cAAc,CAAC;AACvB,iBAAA;gBAED,YAAY,GAAG,IAAI,CAAC;gBACpB,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAE5C,gBAAA,OAAO,cAAc,CAAC;AACxB,aAAC,CAAC;AAEF,YAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE;AACvC,gBAAA,KAAK,EAAE,OAAO;AACf,aAAA,CAAC,CAAC;AAEH,YAAA,OAAO,OAAc,CAAC;SACvB;KACF,CAAC;AACJ;;AC9DA;;AAEG;;;;"}