{"version":3,"sources":["weak-action.ts"],"sourcesContent":["import { isolatedScope } from \"./isolated-scope.ts\";\n\n/**\n * Run a weak action (function that is called once with weak dependencies).\n * If one of the weak dependencies is garbage collected, an optional deinit function is called.\n * @param weakRefs\n * @param action an isolated callback function that provides weak references. External dependency variable must be explicitly added with use()\n * @param deinit an isolated callback function that is called on garbage collection. External dependency variable must be explicitly added with use()\n */\nexport function weakAction<T extends Record<string, WeakKey>, R, D extends Record<string, WeakKey>|undefined>(weakDependencies: T, action: (values: {[K in keyof T]: WeakRef<T[K]>}) => R, deinit?: (actionResult: R, collectedVariable: keyof T, weakDeinitDependencies: D) => unknown, weakDeinitDependencies?: D) {\n\tconst weakRefs = _getWeakRefs(weakDependencies);\n\tconst weakDeinitRefs = weakDeinitDependencies ? _getWeakRefs(weakDeinitDependencies) : undefined;\n\n\tlet result:R|WeakRef<R&object>;\n\n\taction = isolatedScope(action);\n\n\t// optional deinit\n\tif (deinit) {\n\t\tdeinit = isolatedScope(deinit);\n\n\t\tconst deinitFn = deinit;\n\n\t\tconst deinitHandler = (k: string) => {\n\t\t\tregistries.delete(registry)\n\n\t\t\t// unwrap all deinit weak refs\n\t\t\tconst weakDeinitDeps = weakDeinitRefs && Object.fromEntries(\n\t\t\t\tObject.entries(weakDeinitRefs).map(([k, v]) => [k, v.deref()])\n\t\t\t)\n\t\t\t// check if all deinit weak refs are still alive, otherwise return\n\t\t\tif (weakDeinitDeps) {\n\t\t\t\tfor (const v of Object.values(weakDeinitDeps)) {\n\t\t\t\t\tif (v === undefined) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst unwrappedResult = result instanceof WeakRef ? result.deref() : result;\n\t\t\tif (result instanceof WeakRef && unwrappedResult === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdeinitFn(unwrappedResult!, k, weakDeinitDeps as D);\n\t\t}\n\t\tconst registry = new FinalizationRegistry(deinitHandler);\n\t\tregistries.add(registry)\n\t\n\t\tfor (const [k, v] of Object.entries(weakDependencies)) {\n\t\t\t// if (v.constructor.name.startsWith(\"Iterable\")) {\n\t\t\t// \tconst t =  \"x\".repeat(30)\n\t\t\t// \t\t.replace(/./g, c => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"[Math.floor(Math.random() * 62) ] );\n\t\t\t// \tconsole.log(t);\n\t\t\t// \tv[Symbol()] = t;\n\t\t\t// }\n\t\t\tregistry.register(v, k);\n\t\t}\n\t}\n\t\n\t// call action once\n\tconst actionResult = action(weakRefs);\n\tresult = (actionResult && (typeof actionResult === \"object\" || typeof actionResult == \"function\")) ? new WeakRef(actionResult) : actionResult;\n}\n\nfunction _getWeakRefs<T extends Record<string, WeakKey>>(weakDependencies: T) {\n\treturn Object.fromEntries(\n\t\tObject.entries(weakDependencies)\n\t\t\t.map(([k, v]) => [k, new WeakRef(v)])\n\t) as {[K in keyof T]: WeakRef<T[K]>};\n}\n\nconst registries = new Set<FinalizationRegistry<string>>();"],"names":["isolatedScope","weakAction","weakDependencies","action","deinit","weakDeinitDependencies","result","weakRefs","_getWeakRefs","weakDeinitRefs","undefined","deinitFn","registry","FinalizationRegistry","k","registries","delete","weakDeinitDeps","Object","fromEntries","entries","map","v","deref","values","unwrappedResult","WeakRef","add","register","actionResult","Set"],"mappings":"AAAA,SAASA,aAAa,QAAQ,sBAAsB;AASpD,OAAO,SAASC,WAA8FC,gBAAmB,EAAEC,MAAsD,EAAEC,MAA4F,EAAEC,sBAA0B;QAI9SC;IAHJ,IAAMC,WAAWC,aAAaN,mBACxBO,iBAAiBJ,yBAAyBG,aAAaH,0BAA0BK,KAAAA;IAOvF,IAHAP,SAASH,cAAcG,SAGnBC,QAAQ;QAGX,IAAMO,WAFNP,SAASJ,cAAcI,SA2BjBQ,WAAW,IAAIC,qBAvBC,CAACC;YACtBC,WAAWC,MAAM,CAACJ;YAGlB,IAAMK,iBAAiBR,kBAAkBS,OAAOC,WAAW,CAC1DD,OAAOE,OAAO,CAACX,gBAAgBY,GAAG,CAAC,CAAC,CAACP,GAAGQ,EAAE,GAAK;oBAACR;oBAAGQ,EAAEC,KAAK;iBAAG;YAG9D,IAAIN,gBACH;gBAAA,KAAK,IAAMK,KAAKJ,OAAOM,MAAM,CAACP,gBAC7B,IAAIK,AAAMZ,KAAAA,MAANY,GACH;YAEF;YAGD,IAAMG,kBAAkBnB,kBAAkBoB,UAAUpB,OAAOiB,KAAK,KAAKjB;YACjEA,kBAAkBoB,WAAWD,AAAoBf,KAAAA,MAApBe,mBAIjCd,SAASc,iBAAkBX,GAAGG;QAC/B;QAIA,KAAK,IAAM,CAACH,GAAGQ,EAAE,KAFjBP,WAAWY,GAAG,CAACf,WAEMM,OAAOE,OAAO,CAAClB,mBAOnCU,SAASgB,QAAQ,CAACN,GAAGR;IAEvB;IAGA,IAAMe,eAAe1B,OAAOI;IAC5BD,SAAS,AAACuB,gBAAiB,CAAA,AAAwB,YAAxB,OAAOA,gBAA6B,AAAuB,cAAvB,OAAOA,YAAyB,IAAM,IAAIH,QAAQG,gBAAgBA;AAClI;AAEA,SAASrB,aAAgDN,gBAAmB;IAC3E,OAAOgB,OAAOC,WAAW,CACxBD,OAAOE,OAAO,CAAClB,kBACbmB,GAAG,CAAC,CAAC,CAACP,GAAGQ,EAAE,GAAK;YAACR;YAAG,IAAIY,QAAQJ;SAAG;AAEvC;AAEA,IAAMP,aAAa,IAAIe","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/utils/","file":"weak-action.ts"}