silentium 0.0.34 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/.github/workflows/node.js.yml +31 -0
  2. package/CHANGELOG.md +22 -0
  3. package/README.md +32 -2
  4. package/dist/silentium.cjs +37 -10
  5. package/dist/silentium.cjs.map +1 -1
  6. package/dist/silentium.d.ts +9 -2
  7. package/dist/silentium.js +37 -11
  8. package/dist/silentium.js.map +1 -1
  9. package/dist/silentium.min.js +1 -1
  10. package/dist/silentium.min.mjs +1 -1
  11. package/dist/silentium.min.mjs.map +1 -1
  12. package/dist/silentium.mjs +37 -11
  13. package/dist/silentium.mjs.map +1 -1
  14. package/docs/assets/js/index.mjs +11 -1
  15. package/docs/build.sh +3 -3
  16. package/docs/buildRoutes.sh +1 -1
  17. package/docs/index-dev.html +2 -2
  18. package/docs/index.html +5 -5
  19. package/docs/pages/compatibility/dip.html +3 -3
  20. package/docs/pages/en/compatibility/dip.html +3 -3
  21. package/docs/pages/en/examples/errors.html +55 -116
  22. package/docs/pages/en/guest/guest-applied.html +9 -19
  23. package/docs/pages/en/guest/guest-cast.html +70 -140
  24. package/docs/pages/en/guest/guest-disposable.html +30 -58
  25. package/docs/pages/en/guest/guest-executor-applied.html +15 -34
  26. package/docs/pages/en/guest/guest-sync.html +13 -22
  27. package/docs/pages/en/guest/index.html +3 -3
  28. package/docs/pages/en/guest.html +22 -37
  29. package/docs/pages/en/patron/index.html +1 -1
  30. package/docs/pages/en/patron/patron-applied.html +17 -32
  31. package/docs/pages/en/patron/patron-executor-applied.html +14 -40
  32. package/docs/pages/en/patron/patron-once.html +18 -35
  33. package/docs/pages/en/patron/patron-pool.html +5 -20
  34. package/docs/pages/en/patron.html +21 -23
  35. package/docs/pages/en/philosofy.html +2 -2
  36. package/docs/pages/en/source/index.html +2 -2
  37. package/docs/pages/en/source/source-all.html +12 -69
  38. package/docs/pages/en/source/source-applied.html +29 -40
  39. package/docs/pages/en/source/source-changeable.html +18 -37
  40. package/docs/pages/en/source/source-dynamic.html +25 -44
  41. package/docs/pages/en/source/source-executor-applied.html +21 -42
  42. package/docs/pages/en/source/source-filtered.html +16 -32
  43. package/docs/pages/en/source/source-map.html +44 -105
  44. package/docs/pages/en/source/source-once.html +10 -32
  45. package/docs/pages/en/source/source-race.html +16 -57
  46. package/docs/pages/en/source/source-sequence.html +23 -82
  47. package/docs/pages/en/source/source-sync.html +11 -17
  48. package/docs/pages/en/source/source.html +2 -2
  49. package/docs/pages/en/source.html +46 -82
  50. package/docs/pages/en/terminology/introduction.html +1 -1
  51. package/docs/pages/en/terminology/source.html +2 -2
  52. package/docs/pages/en/utils/give.html +2 -2
  53. package/docs/pages/en/utils/is-guest-aware.html +1 -1
  54. package/docs/pages/en/utils/is-guest.html +1 -1
  55. package/docs/pages/en/utils/is-patron-in-pools.html +1 -1
  56. package/docs/pages/en/utils/is-source.html +1 -1
  57. package/docs/pages/en/utils/private.html +2 -2
  58. package/docs/pages/en/utils/remove-patron-from-pools.html +1 -1
  59. package/docs/pages/en/utils/source-of.html +1 -1
  60. package/docs/pages/en/utils/value.html +2 -2
  61. package/docs/pages/examples/errors.html +54 -115
  62. package/docs/pages/guest/guest-applied.html +8 -25
  63. package/docs/pages/guest/guest-cast.html +69 -144
  64. package/docs/pages/guest/guest-disposable.html +8 -37
  65. package/docs/pages/guest/guest-executor-applied.html +15 -38
  66. package/docs/pages/guest/guest-sync.html +12 -19
  67. package/docs/pages/guest/index.html +3 -3
  68. package/docs/pages/guest.html +24 -39
  69. package/docs/pages/patron/index.html +1 -1
  70. package/docs/pages/patron/patron-applied.html +17 -32
  71. package/docs/pages/patron/patron-executor-applied.html +26 -52
  72. package/docs/pages/patron/patron-once.html +13 -30
  73. package/docs/pages/patron/patron-pool.html +16 -31
  74. package/docs/pages/patron.html +40 -74
  75. package/docs/pages/philosofy.html +2 -2
  76. package/docs/pages/source/index.html +2 -2
  77. package/docs/pages/source/source-all.html +11 -68
  78. package/docs/pages/source/source-applied.html +9 -32
  79. package/docs/pages/source/source-changeable.html +14 -33
  80. package/docs/pages/source/source-dynamic.html +25 -44
  81. package/docs/pages/source/source-executor-applied.html +20 -41
  82. package/docs/pages/source/source-filtered.html +16 -32
  83. package/docs/pages/source/source-map.html +44 -105
  84. package/docs/pages/source/source-once.html +7 -29
  85. package/docs/pages/source/source-race.html +16 -57
  86. package/docs/pages/source/source-sequence.html +22 -81
  87. package/docs/pages/source/source-sync.html +11 -17
  88. package/docs/pages/source/source.html +2 -2
  89. package/docs/pages/source.html +45 -82
  90. package/docs/pages/terminology/introduction.html +1 -1
  91. package/docs/pages/terminology/source.html +2 -2
  92. package/docs/pages/utils/give.html +2 -2
  93. package/docs/pages/utils/is-guest-aware.html +1 -1
  94. package/docs/pages/utils/is-guest.html +1 -1
  95. package/docs/pages/utils/is-patron-in-pools.html +1 -1
  96. package/docs/pages/utils/is-source.html +1 -1
  97. package/docs/pages/utils/private.html +2 -2
  98. package/docs/pages/utils/remove-patron-from-pools.html +1 -1
  99. package/docs/pages/utils/source-of.html +1 -1
  100. package/docs/pages/utils/value.html +2 -2
  101. package/docs/routes.json +1 -1
  102. package/docs/template.html +2 -2
  103. package/package.json +1 -1
  104. package/src/Source/SourceLazy.ts +23 -10
  105. package/src/index.ts +1 -0
  106. package/docs/assets/js/lib/StyleFetched.mjs +0 -19
@@ -0,0 +1,31 @@
1
+ # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
2
+ # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
3
+
4
+ name: Node.js CI
5
+
6
+ on:
7
+ push:
8
+ branches: [ "main" ]
9
+ pull_request:
10
+ branches: [ "main" ]
11
+
12
+ jobs:
13
+ build:
14
+
15
+ runs-on: ubuntu-latest
16
+
17
+ strategy:
18
+ matrix:
19
+ node-version: [18.x, 20.x, 22.x]
20
+ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
21
+
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - name: Use Node.js ${{ matrix.node-version }}
25
+ uses: actions/setup-node@v4
26
+ with:
27
+ node-version: ${{ matrix.node-version }}
28
+ cache: 'npm'
29
+ - run: npm ci
30
+ - run: npm run build --if-present
31
+ - run: npm test
package/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [0.0.36](https://github.com/silentium-lab/silentium/compare/v0.0.35...v0.0.36) (2025-05-31)
6
+
7
+
8
+ ### Features
9
+
10
+ * **47-sourcelazy-component:** source lazy done ([ed97056](https://github.com/silentium-lab/silentium/commit/ed9705603913451e22ed6994005f6a5b656dacde))
11
+
12
+ ### [0.0.35](https://github.com/silentium-lab/silentium/compare/v0.0.34...v0.0.35) (2025-05-25)
13
+
14
+
15
+ ### Features
16
+
17
+ * **main:** fix docs ([9aa9c9d](https://github.com/silentium-lab/silentium/commit/9aa9c9d01b1e7c40691a94eb8fc53b3c4fb5c2d6))
18
+ * **main:** fixes for code examples ([a2ce207](https://github.com/silentium-lab/silentium/commit/a2ce2071ea8cb3be1c7976f2d6c4c29e7bfae97a))
19
+ * **main:** guest applied en done ([4fee232](https://github.com/silentium-lab/silentium/commit/4fee23232873f188a3f4d8f963502460a85742ad))
20
+ * **main:** guest cast done ([8c3632d](https://github.com/silentium-lab/silentium/commit/8c3632dd86dc52d0cb9ec4ad99667748e26d6a9d))
21
+ * **main:** guest cast ru done ([db0cbcd](https://github.com/silentium-lab/silentium/commit/db0cbcd0ab5d2d3f040aeaba360013b5a12bffc8))
22
+ * **main:** guest disposable done ([dcebfff](https://github.com/silentium-lab/silentium/commit/dcebfff46621785b34c4747be417211292b944f0))
23
+ * **main:** guest syn and guest done ([ced7528](https://github.com/silentium-lab/silentium/commit/ced7528175223289e5666ffcb76e94438a351c05))
24
+ * **main:** patron page ([54da1c0](https://github.com/silentium-lab/silentium/commit/54da1c0b175615a8e8aff3d61529ea15ac804150))
25
+ * **main:** source sync and errors done ([4210875](https://github.com/silentium-lab/silentium/commit/4210875d2e0259c56d4ac586c8ca15c34c4a6ef7))
26
+
5
27
  ### [0.0.34](https://github.com/silentium-lab/silentium/compare/v0.0.33...v0.0.34) (2025-05-21)
6
28
 
7
29
 
package/README.md CHANGED
@@ -1,3 +1,33 @@
1
- # Silentium
1
+ <p align="center">
2
+ <a href="https://silentium-lab.github.io/silentium/#/en/" target="_blank" rel="noopener noreferrer" style="display:flex">
3
+ <img width="180" src="https://silentium-lab.github.io/silentium/assets/img/logo.svg" alt="logo">
4
+ </a>
5
+ </p>
6
+ <h1 align="center">Silentium</h1>
7
+ <br/>
8
+ <p align="center">
9
+ <a href="https://npmjs.com/package/silentium"><img src="https://img.shields.io/npm/v/silentium.svg" alt="npm package"></a>
10
+ <a href="https://github.com/silentium-lab/silentium/actions/workflows/node.js.yml"><img src="https://github.com/silentium-lab/silentium/actions/workflows/node.js.yml/badge.svg?branch=main" alt="build status"></a>
11
+ </p>
12
+ <br/>
2
13
 
3
- [Документация](https://github.com/silentium-lab/)
14
+ [Documentation](https://silentium-lab.github.io/silentium/#/en/)
15
+
16
+ To install the library you can use the command.
17
+
18
+ ```bash
19
+ npm install silentium
20
+ ```
21
+
22
+ The library helps you create abstractions for information in your system. Instead of working with data abstractions and operations abstractions, you can combine them into a common information abstraction. The approach in which we combine data and operations under information abstractions is object-oriented programming.
23
+
24
+ The idea for the project was born from the ideas of eolang and was inspired by this paper, 𝜑-calculus:
25
+ https://arxiv.org/pdf/2111.13384
26
+
27
+ ## Difference from eolang
28
+
29
+ Unlike eolang, where the program starts working at the moment when some method receives data, which is called dataization, Silentium starts executing the program at the moment when a guest comes to the information source, requesting data, this difference allows the Silentium library to work on top of JavaScript events, creating abstractions of information around some event models.
30
+
31
+ ## Is silentium reactive?
32
+
33
+ Silentium is not a reactive programming library, chains of objects only interact with each other through message passing, but due to the fact that Silentium is developed with the idea of ​​working on top of events, it allows for easy integration with any reactive library or framework, transferring event sources to the reactive mechanisms of the required frameworks.
@@ -714,15 +714,22 @@ const sourceLazy = (lazySrc, args, resetSrc) => {
714
714
  let instance = null;
715
715
  const result = sourceOf();
716
716
  const resultResettable = sourceResettable(result, resetSrc ?? sourceOf());
717
- value(
718
- sourceAll(args),
719
- patron(() => {
720
- if (!instance) {
721
- instance = lazySrc.get(...args);
722
- value(instance, patron(result));
723
- }
724
- })
725
- );
717
+ let wasInstantiated = false;
718
+ const instantiate = () => {
719
+ if (wasInstantiated) {
720
+ return;
721
+ }
722
+ wasInstantiated = true;
723
+ value(
724
+ sourceAll(args),
725
+ patron(() => {
726
+ if (!instance) {
727
+ instance = lazySrc.get(...args);
728
+ value(instance, patron(result));
729
+ }
730
+ })
731
+ );
732
+ };
726
733
  if (resetSrc) {
727
734
  value(
728
735
  resetSrc,
@@ -732,7 +739,26 @@ const sourceLazy = (lazySrc, args, resetSrc) => {
732
739
  })
733
740
  );
734
741
  }
735
- return resultResettable;
742
+ return (g) => {
743
+ instantiate();
744
+ resultResettable.value(g);
745
+ };
746
+ };
747
+
748
+ const sourceDestroyable = (source) => {
749
+ let destructor = null;
750
+ return {
751
+ value(g) {
752
+ destructor = source(g);
753
+ return this;
754
+ },
755
+ destroy() {
756
+ if (destructor !== null && typeof destructor === "function") {
757
+ destructor();
758
+ }
759
+ return this;
760
+ }
761
+ };
736
762
  };
737
763
 
738
764
  const lazyClass = (constructorFn, modules = {}) => {
@@ -790,6 +816,7 @@ exports.sourceAny = sourceAny;
790
816
  exports.sourceApplied = sourceApplied;
791
817
  exports.sourceChain = sourceChain;
792
818
  exports.sourceCombined = sourceCombined;
819
+ exports.sourceDestroyable = sourceDestroyable;
793
820
  exports.sourceDynamic = sourceDynamic;
794
821
  exports.sourceExecutorApplied = sourceExecutorApplied;
795
822
  exports.sourceFiltered = sourceFiltered;
@@ -1 +1 @@
1
- {"version":3,"file":"silentium.cjs","sources":["../src/Source/Source.ts","../src/Guest/Guest.ts","../src/Guest/GuestCast.ts","../src/Guest/GuestSync.ts","../src/Guest/GuestDisposable.ts","../src/Guest/GuestApplied.ts","../src/Guest/GuestExecutorApplied.ts","../src/Patron/Patron.ts","../src/Patron/PatronOnce.ts","../src/Patron/PatronPool.ts","../src/Patron/PatronApplied.ts","../src/Patron/PatronExecutorApplied.ts","../src/Source/SourceSync.ts","../src/Source/SourceChangeable.ts","../src/Source/SourceAll.ts","../src/Source/SourceSequence.ts","../src/Source/SourceMap.ts","../src/Source/SourceRace.ts","../src/Source/SourceChain.ts","../src/Source/SourceDynamic.ts","../src/Source/SourceApplied.ts","../src/Source/SourceExecutorApplied.ts","../src/Source/SourceFiltered.ts","../src/Source/SourceOnce.ts","../src/Source/SourceCombined.ts","../src/Source/SourceResettable.ts","../src/Source/SourceAny.ts","../src/Source/SourceLazy.ts","../src/Lazy/LazyClass.ts","../src/Lazy/Lazy.ts"],"sourcesContent":["import { give, GuestType } from \"../Guest/Guest\";\n\nexport type SourceExecutorType<T, R = unknown> = (guest: GuestType<T>) => R;\n\nexport interface SourceObjectType<T> {\n value: SourceExecutorType<T>;\n}\n\nexport type SourceDataType<T> = Extract<\n T,\n string | number | boolean | Date | object | Array<unknown> | symbol\n>;\n\nexport type SourceType<T = any> =\n | SourceExecutorType<T>\n | SourceObjectType<T>\n | SourceDataType<T>;\n\n/**\n * Helps to connect source and guest, if you need to get value in guest from source\n * helpful because we don't know what shape of source do we have, it can be function or object or primitive\n * @url https://silentium-lab.github.io/silentium/#/utils/value\n */\nexport const value = <T>(source: SourceType<T>, guest: GuestType<T>) => {\n if (source === undefined || source === null) {\n throw new Error(\"value didn't receive source argument\");\n }\n if (guest === undefined || source === null) {\n throw new Error(\"value didn't receive guest argument\");\n }\n if (typeof source === \"function\") {\n source(guest);\n } else if (\n typeof source === \"object\" &&\n \"value\" in source &&\n typeof source.value === \"function\"\n ) {\n source.value(guest);\n } else {\n give(source as T, guest);\n }\n\n return source;\n};\n\n/**\n * Helps to check what some information is of source shape\n * @url https://silentium-lab.github.io/silentium/#/utils/is-source\n */\nexport const isSource = <T>(\n mbSource: T | SourceType<T>,\n): mbSource is SourceType<T> => {\n if (\n mbSource !== null &&\n typeof mbSource === \"object\" &&\n \"value\" in mbSource &&\n typeof mbSource.value === \"function\"\n ) {\n return true;\n }\n return mbSource !== null && mbSource !== undefined;\n};\n\n/**\n * Represents source as function\n * @url https://silentium-lab.github.io/silentium/#/source\n */\nexport const source = <T>(source: SourceType<T>): SourceExecutorType<T> => {\n if (source === undefined) {\n throw new Error(\"Source constructor didn't receive executor function\");\n }\n\n return (guest: GuestType<T>) => {\n value(source, guest);\n };\n};\n","import { source, SourceExecutorType, SourceType } from \"../Source/Source\";\n\ntype GuestIntroduction = \"guest\" | \"patron\";\n\nexport type GuestExecutorType<T = any, This = void> = (value: T) => This;\n\nexport interface GuestObjectType<T = any> {\n give(value: T): this;\n introduction?(): GuestIntroduction;\n}\n\nexport type GuestType<T = any> = GuestExecutorType<T> | GuestObjectType<T>;\n\n/**\n * Helps to give data to guest, guests can be of different shapes\n * function guest or object guest\n * @url https://silentium-lab.github.io/silentium/#/utils/give\n */\nexport const give = <T>(\n data: T,\n guest?: GuestType<T>,\n): GuestType<T> | SourceExecutorType<T> => {\n if (data === undefined) {\n throw new Error(\"give didn't receive data argument\");\n }\n if (guest === undefined) {\n return source<T>(data as SourceType<T>) as SourceExecutorType<T>;\n }\n if (typeof guest === \"function\") {\n guest(data);\n } else {\n guest.give(data);\n }\n return guest;\n};\n\n/**\n * Helps to check if mbGuest can be used to retrieve value\n * @url https://silentium-lab.github.io/silentium/#/utils/is-guest\n */\nexport const isGuest = (mbGuest: any): mbGuest is GuestType => {\n if (mbGuest === undefined) {\n throw new Error(\"isGuest didnt receive mbGuest argument\");\n }\n return typeof mbGuest === \"function\" || typeof mbGuest?.give === \"function\";\n};\n\n/**\n * Helps to create guest of object type\n * @url https://silentium-lab.github.io/silentium/#/guest\n */\nexport const guest = <T>(receiver: GuestExecutorType<T>) => {\n if (!receiver) {\n throw new Error(\"receiver function was not passed to Guest constructor\");\n }\n const result = {\n give(value: T) {\n receiver(value);\n return result;\n },\n };\n return result;\n};\n","import { give, GuestType } from \"./Guest\";\nimport { GuestDisposableType, MaybeDisposableType } from \"./GuestDisposable\";\n\n/**\n * Helps to inherit guest behavior, its introduction and dispose settings\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-cast\n */\nexport const guestCast = <T>(\n sourceGuest: GuestType<any>,\n targetGuest: GuestType<T>,\n): GuestDisposableType<T> => {\n if (sourceGuest === undefined) {\n throw new Error(\"GuestCast didn't receive sourceGuest argument\");\n }\n if (targetGuest === undefined) {\n throw new Error(\"GuestCast didn't receive targetGuest argument\");\n }\n\n const result = {\n disposed(value: T | null): boolean {\n const maybeDisposable = sourceGuest as MaybeDisposableType;\n return maybeDisposable.disposed ? maybeDisposable.disposed(value) : false;\n },\n give(value: T) {\n give(value, targetGuest);\n return result;\n },\n introduction() {\n if (typeof sourceGuest === \"function\") {\n return \"guest\";\n }\n if (!sourceGuest.introduction) {\n return \"guest\";\n }\n return sourceGuest.introduction();\n },\n };\n\n return result;\n};\n","import { GuestObjectType } from \"./Guest\";\n\nexport interface GuestValueType<T = any> extends GuestObjectType<T> {\n value(): T;\n}\n\n/**\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-sync\n */\nexport const guestSync = <T>(theValue?: T): GuestValueType<T> => {\n const result = {\n give(value: T) {\n theValue = value;\n return result;\n },\n value() {\n if (theValue === undefined) {\n throw new Error(\"no value in GuestSync!\");\n }\n return theValue;\n },\n };\n\n return result;\n};\n","import { give, GuestObjectType, GuestType } from \"./Guest\";\n\nexport interface GuestDisposableType<T = any> extends GuestObjectType<T> {\n disposed(value: T | null): boolean;\n}\n\nexport type MaybeDisposableType<T = any> = Partial<GuestDisposableType<T>>;\n\n/**\n * Connects to guest logic what can tell PatronPool\n * what guest don't need to receive new values\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-disposable\n */\nexport const guestDisposable = <T>(\n guest: GuestType,\n disposeCheck: (value: T | null) => boolean,\n): GuestDisposableType<T> => {\n if (guest === undefined) {\n throw new Error(\"GuestDisposable didn't receive guest argument\");\n }\n if (disposeCheck === undefined) {\n throw new Error(\"GuestDisposable didn't receive disposeCheck argument\");\n }\n\n const result = {\n disposed(value: T | null): boolean {\n return disposeCheck(value);\n },\n give(value: T) {\n give(value, guest);\n return result;\n },\n };\n\n return result;\n};\n","import { give, GuestObjectType, GuestType } from \"../Guest/Guest\";\n\n/**\n * Helps to apply function to value before baseGuest will receive it\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-applied\n */\nexport const guestApplied = <T, R>(\n baseGuest: GuestType<R>,\n applier: (value: T) => R,\n): GuestObjectType<T> => {\n const result = {\n give(value: T) {\n give(applier(value), baseGuest);\n return result;\n },\n };\n return result;\n};\n","import {\n give,\n GuestExecutorType,\n GuestObjectType,\n GuestType,\n} from \"../Guest/Guest\";\n\n/**\n * Apply function to guest function of receiving value, useful for debouncing or throttling\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-executor-applied\n */\nexport const guestExecutorApplied = <T>(\n baseGuest: GuestType<T>,\n applier: (executor: GuestExecutorType<T>) => GuestExecutorType<T>,\n): GuestObjectType<T> => {\n const result = {\n give: applier((v) => give(v, baseGuest)),\n };\n\n return result as GuestObjectType<T>;\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { GuestDisposableType } from \"../Guest/GuestDisposable\";\n\nexport type PatronType<T> = GuestDisposableType<T> & {\n introduction(): \"patron\";\n};\n\n/**\n * Helps to check what incoming object is patron\n * @url https://silentium-lab.github.io/silentium/#/utils/is-patron\n */\nexport const isPatron = (guest: GuestType): guest is PatronType<unknown> =>\n typeof guest === \"object\" &&\n guest !== null &&\n guest?.introduction?.() === \"patron\";\n\nexport const introduction = () => \"patron\" as const;\n\n/**\n * Help to turn existed guest intro patron\n * @url https://silentium-lab.github.io/silentium/#/patron\n */\nexport const patron = <T>(\n willBePatron: GuestType<T>,\n): GuestDisposableType<T> => {\n if (willBePatron === undefined) {\n throw new Error(\"Patron didn't receive willBePatron argument\");\n }\n\n const result = {\n give(value: T) {\n give(value, willBePatron);\n return result;\n },\n disposed(value: T | null): boolean {\n const maybeDisposable = willBePatron as GuestDisposableType;\n return maybeDisposable?.disposed?.(value) || false;\n },\n introduction,\n };\n\n return result;\n};\n","import { introduction } from \"../Patron/Patron\";\nimport { give, GuestType } from \"../Guest/Guest\";\nimport {\n GuestDisposableType,\n MaybeDisposableType,\n} from \"../Guest/GuestDisposable\";\n\n/**\n * Helps to call patron only once, this will be helpful when you\n * need value but you know what value can not be existed at a time of requesting\n * @url https://silentium-lab.github.io/silentium/#/patron/patron-once\n */\nexport const patronOnce = <T>(\n baseGuest: GuestType<T>,\n): GuestDisposableType<T> => {\n if (baseGuest === undefined) {\n throw new Error(\"PatronOnce didn't receive baseGuest argument\");\n }\n\n let received = false;\n\n const result = {\n give(value: T) {\n if (!received) {\n received = true;\n give(value, baseGuest);\n }\n return result;\n },\n disposed(value: T | null): boolean {\n if (received) {\n return true;\n }\n const maybeDisposable = baseGuest as MaybeDisposableType;\n return maybeDisposable.disposed ? maybeDisposable.disposed(value) : false;\n },\n introduction,\n };\n\n return result;\n};\n","import { source, SourceType } from \"../Source/Source\";\nimport { give, GuestObjectType, GuestType } from \"../Guest/Guest\";\nimport { GuestDisposableType } from \"../Guest/GuestDisposable\";\nimport { DestroyableType } from \"../Source/SourceDestroyable\";\n\nconst poolSets = new Map<PoolType, Set<GuestObjectType>>();\nconst poolsOfInitiators = new Map<SourceType, PoolType>();\nconst subSources = new Map<SourceType, SourceType[]>();\n\nconst poolsChangeFns: (() => void)[] = [];\nconst notifyPoolsChange = () => {\n poolsChangeFns.forEach((fn) => fn());\n};\nconst lastPatronPoolsStatistic = {\n poolsCount: 0,\n patronsCount: 0,\n};\n\n/**\n * Helps debug the application and detect issues with frozen pools\n * @url https://silentium-lab.github.io/silentium/#/utils/patron-pools-statistic\n */\nexport const patronPoolsStatistic = source<{\n poolsCount: number;\n patronsCount: number;\n}>((g) => {\n give(lastPatronPoolsStatistic, g);\n poolsChangeFns.push(() => {\n let patronsCount = 0;\n poolSets.forEach((set) => {\n patronsCount += set.size;\n });\n lastPatronPoolsStatistic.poolsCount = poolSets.size;\n lastPatronPoolsStatistic.patronsCount = patronsCount;\n give(lastPatronPoolsStatistic, g);\n });\n});\n\n/**\n * Helps to connect source and subsource, needed to destroy all sub sources\n * when base source will be destroyed\n * @url https://silentium-lab.github.io/silentium/#/utils/sub-source\n */\nexport const subSource = <T>(\n subSource: SourceType,\n source: SourceType<T>,\n): SourceType<T> => {\n if (!subSources.has(source)) {\n subSources.set(source, []);\n }\n\n subSources.get(source)?.push(subSource);\n\n return subSource;\n};\n\n/**\n * Helps to define many sources of one sub source\n */\nexport const subSourceMany = <T>(\n subSourceSrc: SourceType<T>,\n sourcesSrc: SourceType[],\n): SourceType<T> => {\n sourcesSrc.forEach((source) => {\n subSource(subSourceSrc, source);\n });\n return subSourceSrc;\n};\n\n/**\n * Helps to check what given source is destroyable\n * @url https://silentium-lab.github.io/silentium/#/utils/is-destroyable\n */\nexport const isDestroyable = (s: unknown): s is DestroyableType => {\n return (\n typeof s === \"object\" &&\n s !== null &&\n \"destroy\" in s &&\n typeof s.destroy === \"function\"\n );\n};\n\n/**\n * Helps to remove all pools of related initiators\n * @url https://silentium-lab.github.io/silentium/#/utils/destroy\n */\nexport const destroy = (...initiators: SourceType[]) => {\n initiators.forEach((initiator) => {\n if (isDestroyable(initiator)) {\n initiator.destroy();\n }\n const pool = poolsOfInitiators.get(initiator);\n pool?.destroy();\n const foundSubSources = subSources.get(initiator);\n subSources.delete(initiator);\n if (foundSubSources) {\n destroy(...foundSubSources);\n }\n });\n};\n\n/**\n * Returns all pools related to one patron\n * @url https://silentium-lab.github.io/silentium/#/utils/patron-pools\n */\nexport const patronPools = (patron: GuestObjectType) => {\n const pools: PoolType[] = [];\n poolSets.forEach((pool, poolInstance) => {\n if (pool.has(patron)) {\n pools.push(poolInstance);\n }\n });\n return pools;\n};\n\n/**\n * Removes patron from all existed pools\n * @url https://silentium-lab.github.io/silentium/#/utils/remove-patron-from-pools\n */\nexport const removePatronFromPools = (patron: GuestObjectType) => {\n if (patron === undefined) {\n throw new Error(\"removePatronFromPools didn't receive patron argument\");\n }\n poolSets.forEach((pool) => {\n pool.delete(patron);\n });\n notifyPoolsChange();\n};\n\n/**\n * Checks what patron is connected with any pool\n * @url https://silentium-lab.github.io/silentium/#/utils/is-patron-in-pools\n */\nexport const isPatronInPools = (patron: GuestObjectType) => {\n if (patron === undefined) {\n throw new Error(\"isPatronInPools didn't receive patron argument\");\n }\n let inPool = false;\n poolSets.forEach((pool) => {\n if (!inPool) {\n inPool = pool.has(patron);\n }\n });\n return inPool;\n};\n\nexport interface PoolType<T = any> extends GuestObjectType<T> {\n add(guest: GuestObjectType<T>): this;\n distribute(receiving: T, possiblePatron: GuestObjectType<T>): this;\n remove(patron: GuestObjectType<T>): this;\n size(): number;\n destroy(): void;\n}\n\n/**\n * Pool class helps to implement dispatching for patron about new values\n * what may appear in sources\n * @url https://silentium-lab.github.io/silentium/#/patron/patron-pool\n */\nexport class PatronPool<T> implements PoolType<T> {\n private patrons: Set<GuestObjectType<T>>;\n\n public give: (value: T) => this;\n\n public constructor(private initiator: SourceType) {\n this.patrons = new Set<GuestObjectType<T>>();\n poolSets.set(this, this.patrons);\n poolsOfInitiators.set(this.initiator, this);\n const doReceive = (value: T) => {\n this.patrons.forEach((target) => {\n this.sendValueToGuest(value, target);\n });\n };\n this.give = (value: T) => {\n doReceive(value);\n return this;\n };\n notifyPoolsChange();\n }\n\n public size(): number {\n return this.patrons.size;\n }\n\n public add(shouldBePatron: GuestType<T>) {\n if (!shouldBePatron) {\n throw new Error(\"PatronPool add method received nothing!\");\n }\n if (\n typeof shouldBePatron !== \"function\" &&\n shouldBePatron.introduction &&\n shouldBePatron.introduction() === \"patron\"\n ) {\n this.patrons.add(shouldBePatron);\n }\n notifyPoolsChange();\n return this;\n }\n\n public remove(patron: GuestObjectType<T>) {\n this.patrons.delete(patron);\n notifyPoolsChange();\n return this;\n }\n\n public distribute(receiving: T, possiblePatron: GuestType<T>): this {\n this.add(possiblePatron);\n this.sendValueToGuest(receiving, possiblePatron);\n return this;\n }\n\n public destroy() {\n this.patrons.forEach((patron) => {\n this.remove(patron);\n });\n poolSets.delete(this);\n poolsOfInitiators.delete(this.initiator);\n notifyPoolsChange();\n return this;\n }\n\n private sendValueToGuest(value: T, guest: GuestType<T>) {\n const isDisposed = this.guestDisposed(value, guest);\n if (!isDisposed) {\n give(value, guest);\n }\n return this;\n }\n\n private guestDisposed(value: T, guest: GuestType<T>) {\n if ((guest as GuestDisposableType).disposed?.(value)) {\n this.remove(guest as GuestObjectType);\n return true;\n }\n return false;\n }\n}\n","import { introduction } from \"../Patron/Patron\";\nimport { GuestObjectType, GuestType } from \"../Guest/Guest\";\nimport { guestApplied } from \"../Guest/GuestApplied\";\n\n/**\n * Helps to apply function to patron\n * @url https://silentium-lab.github.io/silentium/#/patron/patron-applied\n */\nexport const patronApplied = <T, R>(\n baseGuest: GuestType<R>,\n applier: (value: T) => R,\n): GuestObjectType<T> => {\n const applied = guestApplied(baseGuest, applier);\n\n const result = {\n give(value: T) {\n applied.give(value);\n return result;\n },\n introduction,\n };\n\n return result;\n};\n","import { introduction } from \"../Patron/Patron\";\nimport { GuestExecutorType, GuestType } from \"../Guest/Guest\";\nimport { guestExecutorApplied } from \"../Guest/GuestExecutorApplied\";\n\n/**\n * Helps to apply function to patrons executor\n * @url https://silentium-lab.github.io/silentium/#/patron/patron-executor-applied\n */\nexport const patronExecutorApplied = <T>(\n baseGuest: GuestType<T>,\n applier: (executor: GuestExecutorType) => GuestExecutorType,\n) => {\n const guestApplied = guestExecutorApplied(baseGuest, applier);\n\n const result = {\n give(value: T) {\n guestApplied.give(value);\n return result;\n },\n introduction,\n };\n\n return result;\n};\n","import { subSource } from \"../Patron/PatronPool\";\nimport { GuestType } from \"../Guest/Guest\";\nimport { guestSync } from \"../Guest/GuestSync\";\nimport { patron } from \"../Patron/Patron\";\nimport { SourceObjectType, SourceType, value } from \"../Source/Source\";\n\n/**\n * Helps to represent source value as sync value, what can be returned\n * useful for example in tests\n * @url https://silentium-lab.github.io/silentium/#/source/source-sync\n */\nexport const sourceSync = <T>(\n baseSource: SourceType<T>,\n defaultValue?: unknown,\n): SourceObjectType<T> & { syncValue(): T } => {\n const syncGuest = guestSync<T>(defaultValue as T);\n value(baseSource, patron(syncGuest));\n\n const result = {\n value(guest: GuestType<T>) {\n value(baseSource, guest);\n return this;\n },\n syncValue() {\n try {\n return syncGuest.value() as T;\n } catch {\n throw new Error(\"No value in SourceSync\");\n }\n },\n };\n\n subSource(result, baseSource);\n\n return result;\n};\n","import { sourceSync } from \"../Source/SourceSync\";\nimport { give, guest, GuestObjectType, GuestType } from \"../Guest/Guest\";\nimport { isPatron } from \"../Patron/Patron\";\nimport { patronOnce } from \"../Patron/PatronOnce\";\nimport { PatronPool } from \"../Patron/PatronPool\";\nimport {\n isSource,\n SourceDataType,\n SourceObjectType,\n SourceType,\n value,\n} from \"./Source\";\n\nexport type SourceChangeableType<T = any> = SourceObjectType<T> &\n GuestObjectType<T>;\n\nconst sourceIsEmpty = (source: unknown) =>\n source === undefined || source === null;\n\n/**\n * Ability to create source what can be changed later\n * @url https://silentium-lab.github.io/silentium/#/source/source-of\n */\nexport const sourceOf = <T>(source?: SourceType<T>) => {\n const createdSource = {} as SourceChangeableType<T>;\n const thePool = new PatronPool(createdSource);\n let isEmpty = sourceIsEmpty(source);\n\n if (!isEmpty && isSource(source)) {\n value(\n source,\n patronOnce((unwrappedSourceDocument) => {\n isEmpty = sourceIsEmpty(unwrappedSourceDocument);\n source = unwrappedSourceDocument as SourceDataType<T>;\n }),\n );\n }\n\n createdSource.value = (g: GuestType<T>) => {\n if (isEmpty) {\n if (isPatron(g)) {\n thePool.add(g);\n }\n return createdSource;\n }\n\n if (typeof g === \"function\") {\n thePool.distribute(source, guest(g));\n } else {\n thePool.distribute(source, g);\n }\n\n return createdSource;\n };\n\n createdSource.give = (value: T) => {\n isEmpty = sourceIsEmpty(value);\n source = value as SourceDataType<T>;\n\n if (!isEmpty) {\n thePool.give(source);\n }\n\n return createdSource;\n };\n\n return createdSource as SourceChangeableType<T>;\n};\n\n/**\n * Changeable source what can be changed only once with specified value\n * @url https://silentium-lab.github.io/silentium/#/source/source-memo-of\n */\nexport const sourceMemoOf = <T>(\n source?: SourceType<T>,\n): SourceChangeableType<T> => {\n const result = sourceOf(source);\n const baseSrcSync = sourceSync(result, null);\n\n const resultMemo = {\n value: result.value,\n give(value: T) {\n if (baseSrcSync.syncValue() !== value) {\n give(value, result.give);\n }\n return resultMemo;\n },\n };\n\n return resultMemo;\n};\n","import { removePatronFromPools, subSource } from \"../Patron/PatronPool\";\nimport { give, guest, GuestObjectType, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { patron } from \"../Patron/Patron\";\nimport { SourceObjectType, SourceType, value } from \"./Source\";\nimport { sourceOf } from \"./SourceChangeable\";\nimport { DestroyableType } from \"src/Source/SourceDestroyable\";\n\ntype ExtractType<T> = T extends SourceType<infer U> ? U : never;\n\nexport type ExtractTypesFromArray<T extends SourceType<any>[]> = {\n [K in keyof T]: ExtractType<T[K]>;\n};\n\n/**\n * Represents common value as Array of bunch of sources,\n * when all sources will gets it's values\n * @url https://silentium-lab.github.io/silentium/#/source/source-all\n */\nexport const sourceAll = <const T extends SourceType[]>(\n sources: T,\n): SourceObjectType<ExtractTypesFromArray<T>> & DestroyableType => {\n const keysKnown = new Set<string>(Object.keys(sources));\n const keysFilled = new Set();\n const isAllFilled = () => {\n return keysFilled.size > 0 && keysFilled.size === keysKnown.size;\n };\n const theAll = sourceOf({});\n const patrons: GuestObjectType[] = [];\n\n Object.entries(sources).forEach(([key, source]) => {\n subSource(theAll, source);\n keysKnown.add(key);\n const keyPatron = patron((v) => {\n theAll.value(\n guest((all: Record<string, unknown>) => {\n keysFilled.add(key);\n const lastAll = {\n ...all,\n [key]: v,\n };\n theAll.give(lastAll);\n }),\n );\n });\n patrons.push(keyPatron);\n value(source, keyPatron);\n });\n\n return {\n value(guest: GuestType<ExtractTypesFromArray<T>>) {\n const mbPatron = guestCast(guest, (value: T) => {\n if (isAllFilled()) {\n give(Object.values(value) as ExtractTypesFromArray<T>, guest);\n }\n });\n patrons.push(mbPatron);\n theAll.value(mbPatron);\n },\n destroy() {\n patrons.forEach((patron) => {\n removePatronFromPools(patron);\n });\n },\n };\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { patronOnce } from \"../Patron/PatronOnce\";\nimport { LazyType } from \"../Lazy/Lazy\";\nimport { isSource, SourceType, value } from \"./Source\";\nimport { sourceAll } from \"./SourceAll\";\nimport { sourceOf, SourceChangeableType } from \"./SourceChangeable\";\n\n/**\n * Ability to apply source to source of array values sequentially\n * @url https://silentium-lab.github.io/silentium/#/source/source-sequence\n */\nexport const sourceSequence = <T, TG>(\n baseSource: SourceType<T[]>,\n targetSource: LazyType<SourceType<TG>>,\n) => {\n if (baseSource === undefined) {\n throw new Error(\"SourceSequence didn't receive baseSource argument\");\n }\n if (targetSource === undefined) {\n throw new Error(\"SourceSequence didn't receive targetSource argument\");\n }\n\n return (guest: GuestType<TG[]>) => {\n const sequenceSource = sourceOf();\n const source = targetSource.get(sequenceSource);\n\n value(\n baseSource,\n guestCast(guest, (theValue) => {\n let index = 0;\n\n const sources: SourceChangeableType[] = [];\n theValue.forEach(() => {\n sources.push(sourceOf());\n });\n\n const nextItemHandle = () => {\n if (theValue[index + 1] !== undefined) {\n index = index + 1;\n handle();\n }\n };\n\n function handle() {\n const currentSource = sources[index];\n const nextValue = theValue[index];\n if (isSource(nextValue)) {\n value(\n nextValue,\n patronOnce((theNextValue) => {\n sequenceSource.give(theNextValue);\n value(source, currentSource);\n nextItemHandle();\n }),\n );\n } else {\n sequenceSource.give(nextValue);\n value(source, currentSource);\n nextItemHandle();\n }\n }\n\n if (theValue[index] !== undefined) {\n handle();\n value(sourceAll(sources), guest);\n } else {\n give([], guest);\n }\n }),\n );\n };\n};\n","import { patron } from \"../Patron/Patron\";\nimport { patronOnce } from \"../Patron/PatronOnce\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\nimport { give } from \"../Guest/Guest\";\nimport { LazyType } from \"../Lazy/Lazy\";\nimport { destroy, subSource } from \"../Patron/PatronPool\";\nimport { SourceType, value } from \"./Source\";\nimport { sourceAll } from \"./SourceAll\";\n\n/**\n * Helps to modify many sources with one private source\n * @url https://silentium-lab.github.io/silentium/#/source/source-map\n */\nexport const sourceMap = <T, TG>(\n baseSource: SourceType<T[]>,\n targetSource: LazyType<SourceType<TG>>,\n) => {\n if (baseSource === undefined) {\n throw new Error(\"SourceMap didn't receive baseSource argument\");\n }\n if (targetSource === undefined) {\n throw new Error(\"SourceMap didn't receive targetSource argument\");\n }\n\n const result = sourceOf<TG[]>();\n\n value(\n baseSource,\n patron((theValue) => {\n const sources: SourceType[] = [];\n theValue.forEach((val) => {\n const source = targetSource.get(val);\n subSource(source, baseSource);\n sources.push(source);\n });\n value(\n sourceAll(sources),\n patronOnce((v) => {\n destroy(...sources);\n give(v, result);\n }),\n );\n }),\n );\n\n return result.value;\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { SourceType, value } from \"./Source\";\n\n/**\n * Connects guest with source what give response faster than others\n * @url https://silentium-lab.github.io/silentium/#/source/source-race\n */\nexport const sourceRace = <T>(sources: SourceType<T>[]) => {\n if (sources === undefined) {\n throw new Error(\"SourceRace didnt receive sources argument\");\n }\n\n return (guest: GuestType<T>) => {\n let connectedWithSource: SourceType | null = null;\n sources.forEach((source) => {\n value(\n source,\n guestCast(<GuestType>guest, (value) => {\n if (!connectedWithSource || connectedWithSource === source) {\n give(value as T, guest);\n connectedWithSource = source;\n }\n }),\n );\n });\n };\n};\n","import { patron } from \"../Patron/Patron\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype Last<T extends any[]> = T extends [...infer U, infer L] ? L : never;\n\n/**\n * Returns value of some source when all sources before it gives their response\n * @url https://silentium-lab.github.io/silentium/#/source/source-chain\n */\nexport const sourceChain = <T extends SourceType[]>(\n ...sources: T\n): SourceType<Last<T>> => {\n const resultSrc = sourceOf<Last<T>>();\n const respondedSources = new Set();\n let lastSourceValue: any = null;\n sources.forEach((source, index) => {\n value(\n source,\n patron((value) => {\n respondedSources.add(index);\n if (index === sources.length - 1) {\n lastSourceValue = value;\n }\n if (\n respondedSources.size === sources.length &&\n lastSourceValue !== null\n ) {\n resultSrc.give(lastSourceValue);\n }\n }),\n );\n });\n\n return resultSrc.value;\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { SourceType, value } from \"./Source\";\nimport { SourceChangeableType } from \"./SourceChangeable\";\n\n/**\n * Ability to build common changeable source from different guest and source\n * @url https://silentium-lab.github.io/silentium/#/source/source-dynamic\n */\nexport const sourceDynamic = <T>(\n baseGuest: GuestType<T>,\n baseSource: SourceType<T>,\n): SourceChangeableType<T> => {\n if (baseGuest === undefined) {\n throw new Error(\"SourceDynamic didn't receive baseGuest argument\");\n }\n if (baseSource === undefined) {\n throw new Error(\"SourceDynamic didn't receive baseSource argument\");\n }\n\n const sourceObject = {\n value(guest: GuestType<T>) {\n value(baseSource, guest);\n return sourceObject;\n },\n give(value: T) {\n give(value, baseGuest);\n return this;\n },\n };\n\n return sourceObject;\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { SourceType, value } from \"../Source/Source\";\n\n/**\n * Gives ability to apply function to source value\n * @url https://silentium-lab.github.io/silentium/#/source/source-applied\n */\nexport const sourceApplied = <T, R>(\n baseSource: SourceType<T>,\n applier: (v: T) => R,\n) => {\n return (guest: GuestType<R>) => {\n value(\n baseSource,\n guestCast(guest, (v) => {\n give(applier(v), guest);\n }),\n );\n };\n};\n","import { SourceExecutorType, SourceType, value } from \"../Source/Source\";\n\n/**\n * Ability to apply function to source executor, helpful when need to apply throttling or debounce\n * @url https://silentium-lab.github.io/silentium/#/source/source-executor-applied\n */\nexport const sourceExecutorApplied = <T>(\n source: SourceType<T>,\n applier: (executor: SourceExecutorType<T>) => SourceExecutorType<T>,\n) => {\n return applier((g) => {\n value(source, g);\n });\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { SourceType, value } from \"../Source/Source\";\n\n/**\n * Helps not to respond with information what checked by predicate function\n * @url https://silentium-lab.github.io/silentium/#/source/source-filtered\n */\nexport const sourceFiltered = <T>(\n baseSource: SourceType<T>,\n predicate: (v: T) => boolean,\n defaultValue?: T,\n) => {\n return (g: GuestType<T>) => {\n value(\n baseSource,\n guestCast(g, (v) => {\n if (predicate(v) === true) {\n give(v, g);\n } else if (defaultValue !== undefined) {\n give(defaultValue, g);\n }\n }),\n );\n };\n};\n","import { GuestType } from \"../Guest/Guest\";\nimport { SourceType, value } from \"./Source\";\nimport { sourceOf } from \"./SourceChangeable\";\n\n/**\n * Ability set the value only once\n * @url https://silentium-lab.github.io/silentium/#/source/source-once\n */\nexport const sourceOnce = <T>(initialValue?: SourceType<T>) => {\n let isFilled = initialValue !== undefined;\n const source = sourceOf(initialValue);\n\n return {\n value(guest: GuestType<T>) {\n value(source, guest);\n return this;\n },\n give(value: T) {\n if (!isFilled) {\n source.give(value);\n isFilled = true;\n }\n return this;\n },\n };\n};\n","import { GuestType } from \"../Guest/Guest\";\nimport { patron } from \"../Patron/Patron\";\nimport { subSourceMany } from \"../Patron/PatronPool\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { ExtractTypesFromArray, sourceAll } from \"../Source/SourceAll\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\n\n/**\n * Simplifies sources combination, when we need to create value depending on many sources\n * @url https://silentium-lab.github.io/silentium/#/source/source-combined\n */\nexport const sourceCombined =\n <const T extends SourceType[]>(...sources: T) =>\n <R>(\n source: (\n guest: GuestType<R>,\n ...sourcesValues: ExtractTypesFromArray<T>\n ) => void,\n ): SourceType<R> => {\n const result = sourceOf<R>();\n subSourceMany(result, sources);\n\n value(\n sourceAll(sources),\n patron((actualValues) => {\n source(result.give, ...actualValues);\n }),\n );\n\n return result.value;\n };\n","import { give } from \"../Guest/Guest\";\nimport { patron } from \"../Patron/Patron\";\nimport { subSource } from \"../Patron/PatronPool\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\n\n/**\n * @url https://silentium-lab.github.io/silentium/#/source/source-resettable\n */\nexport const sourceResettable = <T>(\n baseSrc: SourceType<T>,\n resettableSrc: SourceType<unknown>,\n) => {\n const result = sourceOf<T>();\n\n value(\n resettableSrc,\n patron(() => {\n give(null, result);\n }),\n );\n\n value(baseSrc, patron(result));\n subSource(result, baseSrc);\n\n return result;\n};\n","import { patron } from \"../Patron/Patron\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\n\n/**\n * Present source of value what was last appeared in any\n * of given sources, can be used as default value, when some source\n * don't respond\n * @url https://silentium-lab.github.io/silentium/#/source/source-any\n */\nexport const sourceAny = <T>(sources: SourceType<T>[]) => {\n const lastSrc = sourceOf<T>();\n sources.forEach((source) => {\n value(source, patron(lastSrc));\n });\n\n return lastSrc;\n};\n","import { LazyType } from \"../Lazy/Lazy\";\nimport { patron } from \"../Patron/Patron\";\nimport { destroy } from \"../Patron/PatronPool\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { sourceAll } from \"../Source/SourceAll\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\nimport { sourceResettable } from \"../Source/SourceResettable\";\n\n/**\n * Helps to build source only when all sources will give its values\n * @url https://silentium-lab.github.io/silentium/#/source/source-lazy\n */\nexport const sourceLazy = <T>(\n lazySrc: LazyType<SourceType<T>>,\n args: SourceType[],\n resetSrc?: SourceType<unknown>,\n) => {\n let instance: SourceType<T> | null = null;\n const result = sourceOf<T>();\n const resultResettable = sourceResettable(result, resetSrc ?? sourceOf());\n\n value(\n sourceAll(args),\n patron(() => {\n if (!instance) {\n instance = lazySrc.get(...args);\n value(instance, patron(result));\n }\n }),\n );\n\n if (resetSrc) {\n value(\n resetSrc,\n patron(() => {\n destroy(instance);\n instance = null;\n }),\n );\n }\n\n return resultResettable;\n};\n","import { LazyType } from \"./Lazy\";\n\ninterface Constructable<T> {\n new (...args: unknown[]): T;\n}\n\ninterface Prototyped<T> {\n prototype: T;\n}\n\nexport const lazyClass = <T>(\n constructorFn: Prototyped<T>,\n modules: Record<string, unknown> = {},\n): LazyType<T> => {\n if (constructorFn === undefined) {\n throw new Error(\"PrivateClass didn't receive constructorFn argument\");\n }\n\n return {\n get<R extends unknown[], CT = null>(...args: R): CT extends null ? T : CT {\n return new (constructorFn as Constructable<T>)(\n ...args,\n modules,\n ) as CT extends null ? T : CT;\n },\n };\n};\n","export interface LazyType<T> {\n get<R extends unknown[], CT = null>(...args: R): CT extends null ? T : CT;\n}\n\n/**\n * Helps to get lazy instance of dependency\n * @url https://silentium-lab.github.io/silentium/#/utils/lazy\n */\nexport const lazy = <T>(buildingFn: (...args: any[]) => T): LazyType<T> => {\n if (buildingFn === undefined) {\n throw new Error(\"lazy didn't receive buildingFn argument\");\n }\n\n return {\n get<R extends unknown[], CT = null>(...args: R): CT extends null ? T : CT {\n return buildingFn(...args) as CT extends null ? T : CT;\n },\n };\n};\n"],"names":["source","guest","subSource","value","patron"],"mappings":"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"}
1
+ {"version":3,"file":"silentium.cjs","sources":["../src/Source/Source.ts","../src/Guest/Guest.ts","../src/Guest/GuestCast.ts","../src/Guest/GuestSync.ts","../src/Guest/GuestDisposable.ts","../src/Guest/GuestApplied.ts","../src/Guest/GuestExecutorApplied.ts","../src/Patron/Patron.ts","../src/Patron/PatronOnce.ts","../src/Patron/PatronPool.ts","../src/Patron/PatronApplied.ts","../src/Patron/PatronExecutorApplied.ts","../src/Source/SourceSync.ts","../src/Source/SourceChangeable.ts","../src/Source/SourceAll.ts","../src/Source/SourceSequence.ts","../src/Source/SourceMap.ts","../src/Source/SourceRace.ts","../src/Source/SourceChain.ts","../src/Source/SourceDynamic.ts","../src/Source/SourceApplied.ts","../src/Source/SourceExecutorApplied.ts","../src/Source/SourceFiltered.ts","../src/Source/SourceOnce.ts","../src/Source/SourceCombined.ts","../src/Source/SourceResettable.ts","../src/Source/SourceAny.ts","../src/Source/SourceLazy.ts","../src/Source/SourceDestroyable.ts","../src/Lazy/LazyClass.ts","../src/Lazy/Lazy.ts"],"sourcesContent":["import { give, GuestType } from \"../Guest/Guest\";\n\nexport type SourceExecutorType<T, R = unknown> = (guest: GuestType<T>) => R;\n\nexport interface SourceObjectType<T> {\n value: SourceExecutorType<T>;\n}\n\nexport type SourceDataType<T> = Extract<\n T,\n string | number | boolean | Date | object | Array<unknown> | symbol\n>;\n\nexport type SourceType<T = any> =\n | SourceExecutorType<T>\n | SourceObjectType<T>\n | SourceDataType<T>;\n\n/**\n * Helps to connect source and guest, if you need to get value in guest from source\n * helpful because we don't know what shape of source do we have, it can be function or object or primitive\n * @url https://silentium-lab.github.io/silentium/#/utils/value\n */\nexport const value = <T>(source: SourceType<T>, guest: GuestType<T>) => {\n if (source === undefined || source === null) {\n throw new Error(\"value didn't receive source argument\");\n }\n if (guest === undefined || source === null) {\n throw new Error(\"value didn't receive guest argument\");\n }\n if (typeof source === \"function\") {\n source(guest);\n } else if (\n typeof source === \"object\" &&\n \"value\" in source &&\n typeof source.value === \"function\"\n ) {\n source.value(guest);\n } else {\n give(source as T, guest);\n }\n\n return source;\n};\n\n/**\n * Helps to check what some information is of source shape\n * @url https://silentium-lab.github.io/silentium/#/utils/is-source\n */\nexport const isSource = <T>(\n mbSource: T | SourceType<T>,\n): mbSource is SourceType<T> => {\n if (\n mbSource !== null &&\n typeof mbSource === \"object\" &&\n \"value\" in mbSource &&\n typeof mbSource.value === \"function\"\n ) {\n return true;\n }\n return mbSource !== null && mbSource !== undefined;\n};\n\n/**\n * Represents source as function\n * @url https://silentium-lab.github.io/silentium/#/source\n */\nexport const source = <T>(source: SourceType<T>): SourceExecutorType<T> => {\n if (source === undefined) {\n throw new Error(\"Source constructor didn't receive executor function\");\n }\n\n return (guest: GuestType<T>) => {\n value(source, guest);\n };\n};\n","import { source, SourceExecutorType, SourceType } from \"../Source/Source\";\n\ntype GuestIntroduction = \"guest\" | \"patron\";\n\nexport type GuestExecutorType<T = any, This = void> = (value: T) => This;\n\nexport interface GuestObjectType<T = any> {\n give(value: T): this;\n introduction?(): GuestIntroduction;\n}\n\nexport type GuestType<T = any> = GuestExecutorType<T> | GuestObjectType<T>;\n\n/**\n * Helps to give data to guest, guests can be of different shapes\n * function guest or object guest\n * @url https://silentium-lab.github.io/silentium/#/utils/give\n */\nexport const give = <T>(\n data: T,\n guest?: GuestType<T>,\n): GuestType<T> | SourceExecutorType<T> => {\n if (data === undefined) {\n throw new Error(\"give didn't receive data argument\");\n }\n if (guest === undefined) {\n return source<T>(data as SourceType<T>) as SourceExecutorType<T>;\n }\n if (typeof guest === \"function\") {\n guest(data);\n } else {\n guest.give(data);\n }\n return guest;\n};\n\n/**\n * Helps to check if mbGuest can be used to retrieve value\n * @url https://silentium-lab.github.io/silentium/#/utils/is-guest\n */\nexport const isGuest = (mbGuest: any): mbGuest is GuestType => {\n if (mbGuest === undefined) {\n throw new Error(\"isGuest didnt receive mbGuest argument\");\n }\n return typeof mbGuest === \"function\" || typeof mbGuest?.give === \"function\";\n};\n\n/**\n * Helps to create guest of object type\n * @url https://silentium-lab.github.io/silentium/#/guest\n */\nexport const guest = <T>(receiver: GuestExecutorType<T>) => {\n if (!receiver) {\n throw new Error(\"receiver function was not passed to Guest constructor\");\n }\n const result = {\n give(value: T) {\n receiver(value);\n return result;\n },\n };\n return result;\n};\n","import { give, GuestType } from \"./Guest\";\nimport { GuestDisposableType, MaybeDisposableType } from \"./GuestDisposable\";\n\n/**\n * Helps to inherit guest behavior, its introduction and dispose settings\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-cast\n */\nexport const guestCast = <T>(\n sourceGuest: GuestType<any>,\n targetGuest: GuestType<T>,\n): GuestDisposableType<T> => {\n if (sourceGuest === undefined) {\n throw new Error(\"GuestCast didn't receive sourceGuest argument\");\n }\n if (targetGuest === undefined) {\n throw new Error(\"GuestCast didn't receive targetGuest argument\");\n }\n\n const result = {\n disposed(value: T | null): boolean {\n const maybeDisposable = sourceGuest as MaybeDisposableType;\n return maybeDisposable.disposed ? maybeDisposable.disposed(value) : false;\n },\n give(value: T) {\n give(value, targetGuest);\n return result;\n },\n introduction() {\n if (typeof sourceGuest === \"function\") {\n return \"guest\";\n }\n if (!sourceGuest.introduction) {\n return \"guest\";\n }\n return sourceGuest.introduction();\n },\n };\n\n return result;\n};\n","import { GuestObjectType } from \"./Guest\";\n\nexport interface GuestValueType<T = any> extends GuestObjectType<T> {\n value(): T;\n}\n\n/**\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-sync\n */\nexport const guestSync = <T>(theValue?: T): GuestValueType<T> => {\n const result = {\n give(value: T) {\n theValue = value;\n return result;\n },\n value() {\n if (theValue === undefined) {\n throw new Error(\"no value in GuestSync!\");\n }\n return theValue;\n },\n };\n\n return result;\n};\n","import { give, GuestObjectType, GuestType } from \"./Guest\";\n\nexport interface GuestDisposableType<T = any> extends GuestObjectType<T> {\n disposed(value: T | null): boolean;\n}\n\nexport type MaybeDisposableType<T = any> = Partial<GuestDisposableType<T>>;\n\n/**\n * Connects to guest logic what can tell PatronPool\n * what guest don't need to receive new values\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-disposable\n */\nexport const guestDisposable = <T>(\n guest: GuestType,\n disposeCheck: (value: T | null) => boolean,\n): GuestDisposableType<T> => {\n if (guest === undefined) {\n throw new Error(\"GuestDisposable didn't receive guest argument\");\n }\n if (disposeCheck === undefined) {\n throw new Error(\"GuestDisposable didn't receive disposeCheck argument\");\n }\n\n const result = {\n disposed(value: T | null): boolean {\n return disposeCheck(value);\n },\n give(value: T) {\n give(value, guest);\n return result;\n },\n };\n\n return result;\n};\n","import { give, GuestObjectType, GuestType } from \"../Guest/Guest\";\n\n/**\n * Helps to apply function to value before baseGuest will receive it\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-applied\n */\nexport const guestApplied = <T, R>(\n baseGuest: GuestType<R>,\n applier: (value: T) => R,\n): GuestObjectType<T> => {\n const result = {\n give(value: T) {\n give(applier(value), baseGuest);\n return result;\n },\n };\n return result;\n};\n","import {\n give,\n GuestExecutorType,\n GuestObjectType,\n GuestType,\n} from \"../Guest/Guest\";\n\n/**\n * Apply function to guest function of receiving value, useful for debouncing or throttling\n * @url https://silentium-lab.github.io/silentium/#/guest/guest-executor-applied\n */\nexport const guestExecutorApplied = <T>(\n baseGuest: GuestType<T>,\n applier: (executor: GuestExecutorType<T>) => GuestExecutorType<T>,\n): GuestObjectType<T> => {\n const result = {\n give: applier((v) => give(v, baseGuest)),\n };\n\n return result as GuestObjectType<T>;\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { GuestDisposableType } from \"../Guest/GuestDisposable\";\n\nexport type PatronType<T> = GuestDisposableType<T> & {\n introduction(): \"patron\";\n};\n\n/**\n * Helps to check what incoming object is patron\n * @url https://silentium-lab.github.io/silentium/#/utils/is-patron\n */\nexport const isPatron = (guest: GuestType): guest is PatronType<unknown> =>\n typeof guest === \"object\" &&\n guest !== null &&\n guest?.introduction?.() === \"patron\";\n\nexport const introduction = () => \"patron\" as const;\n\n/**\n * Help to turn existed guest intro patron\n * @url https://silentium-lab.github.io/silentium/#/patron\n */\nexport const patron = <T>(\n willBePatron: GuestType<T>,\n): GuestDisposableType<T> => {\n if (willBePatron === undefined) {\n throw new Error(\"Patron didn't receive willBePatron argument\");\n }\n\n const result = {\n give(value: T) {\n give(value, willBePatron);\n return result;\n },\n disposed(value: T | null): boolean {\n const maybeDisposable = willBePatron as GuestDisposableType;\n return maybeDisposable?.disposed?.(value) || false;\n },\n introduction,\n };\n\n return result;\n};\n","import { introduction } from \"../Patron/Patron\";\nimport { give, GuestType } from \"../Guest/Guest\";\nimport {\n GuestDisposableType,\n MaybeDisposableType,\n} from \"../Guest/GuestDisposable\";\n\n/**\n * Helps to call patron only once, this will be helpful when you\n * need value but you know what value can not be existed at a time of requesting\n * @url https://silentium-lab.github.io/silentium/#/patron/patron-once\n */\nexport const patronOnce = <T>(\n baseGuest: GuestType<T>,\n): GuestDisposableType<T> => {\n if (baseGuest === undefined) {\n throw new Error(\"PatronOnce didn't receive baseGuest argument\");\n }\n\n let received = false;\n\n const result = {\n give(value: T) {\n if (!received) {\n received = true;\n give(value, baseGuest);\n }\n return result;\n },\n disposed(value: T | null): boolean {\n if (received) {\n return true;\n }\n const maybeDisposable = baseGuest as MaybeDisposableType;\n return maybeDisposable.disposed ? maybeDisposable.disposed(value) : false;\n },\n introduction,\n };\n\n return result;\n};\n","import { source, SourceType } from \"../Source/Source\";\nimport { give, GuestObjectType, GuestType } from \"../Guest/Guest\";\nimport { GuestDisposableType } from \"../Guest/GuestDisposable\";\nimport { DestroyableType } from \"../Source/SourceDestroyable\";\n\nconst poolSets = new Map<PoolType, Set<GuestObjectType>>();\nconst poolsOfInitiators = new Map<SourceType, PoolType>();\nconst subSources = new Map<SourceType, SourceType[]>();\n\nconst poolsChangeFns: (() => void)[] = [];\nconst notifyPoolsChange = () => {\n poolsChangeFns.forEach((fn) => fn());\n};\nconst lastPatronPoolsStatistic = {\n poolsCount: 0,\n patronsCount: 0,\n};\n\n/**\n * Helps debug the application and detect issues with frozen pools\n * @url https://silentium-lab.github.io/silentium/#/utils/patron-pools-statistic\n */\nexport const patronPoolsStatistic = source<{\n poolsCount: number;\n patronsCount: number;\n}>((g) => {\n give(lastPatronPoolsStatistic, g);\n poolsChangeFns.push(() => {\n let patronsCount = 0;\n poolSets.forEach((set) => {\n patronsCount += set.size;\n });\n lastPatronPoolsStatistic.poolsCount = poolSets.size;\n lastPatronPoolsStatistic.patronsCount = patronsCount;\n give(lastPatronPoolsStatistic, g);\n });\n});\n\n/**\n * Helps to connect source and subsource, needed to destroy all sub sources\n * when base source will be destroyed\n * @url https://silentium-lab.github.io/silentium/#/utils/sub-source\n */\nexport const subSource = <T>(\n subSource: SourceType,\n source: SourceType<T>,\n): SourceType<T> => {\n if (!subSources.has(source)) {\n subSources.set(source, []);\n }\n\n subSources.get(source)?.push(subSource);\n\n return subSource;\n};\n\n/**\n * Helps to define many sources of one sub source\n */\nexport const subSourceMany = <T>(\n subSourceSrc: SourceType<T>,\n sourcesSrc: SourceType[],\n): SourceType<T> => {\n sourcesSrc.forEach((source) => {\n subSource(subSourceSrc, source);\n });\n return subSourceSrc;\n};\n\n/**\n * Helps to check what given source is destroyable\n * @url https://silentium-lab.github.io/silentium/#/utils/is-destroyable\n */\nexport const isDestroyable = (s: unknown): s is DestroyableType => {\n return (\n typeof s === \"object\" &&\n s !== null &&\n \"destroy\" in s &&\n typeof s.destroy === \"function\"\n );\n};\n\n/**\n * Helps to remove all pools of related initiators\n * @url https://silentium-lab.github.io/silentium/#/utils/destroy\n */\nexport const destroy = (...initiators: SourceType[]) => {\n initiators.forEach((initiator) => {\n if (isDestroyable(initiator)) {\n initiator.destroy();\n }\n const pool = poolsOfInitiators.get(initiator);\n pool?.destroy();\n const foundSubSources = subSources.get(initiator);\n subSources.delete(initiator);\n if (foundSubSources) {\n destroy(...foundSubSources);\n }\n });\n};\n\n/**\n * Returns all pools related to one patron\n * @url https://silentium-lab.github.io/silentium/#/utils/patron-pools\n */\nexport const patronPools = (patron: GuestObjectType) => {\n const pools: PoolType[] = [];\n poolSets.forEach((pool, poolInstance) => {\n if (pool.has(patron)) {\n pools.push(poolInstance);\n }\n });\n return pools;\n};\n\n/**\n * Removes patron from all existed pools\n * @url https://silentium-lab.github.io/silentium/#/utils/remove-patron-from-pools\n */\nexport const removePatronFromPools = (patron: GuestObjectType) => {\n if (patron === undefined) {\n throw new Error(\"removePatronFromPools didn't receive patron argument\");\n }\n poolSets.forEach((pool) => {\n pool.delete(patron);\n });\n notifyPoolsChange();\n};\n\n/**\n * Checks what patron is connected with any pool\n * @url https://silentium-lab.github.io/silentium/#/utils/is-patron-in-pools\n */\nexport const isPatronInPools = (patron: GuestObjectType) => {\n if (patron === undefined) {\n throw new Error(\"isPatronInPools didn't receive patron argument\");\n }\n let inPool = false;\n poolSets.forEach((pool) => {\n if (!inPool) {\n inPool = pool.has(patron);\n }\n });\n return inPool;\n};\n\nexport interface PoolType<T = any> extends GuestObjectType<T> {\n add(guest: GuestObjectType<T>): this;\n distribute(receiving: T, possiblePatron: GuestObjectType<T>): this;\n remove(patron: GuestObjectType<T>): this;\n size(): number;\n destroy(): void;\n}\n\n/**\n * Pool class helps to implement dispatching for patron about new values\n * what may appear in sources\n * @url https://silentium-lab.github.io/silentium/#/patron/patron-pool\n */\nexport class PatronPool<T> implements PoolType<T> {\n private patrons: Set<GuestObjectType<T>>;\n\n public give: (value: T) => this;\n\n public constructor(private initiator: SourceType) {\n this.patrons = new Set<GuestObjectType<T>>();\n poolSets.set(this, this.patrons);\n poolsOfInitiators.set(this.initiator, this);\n const doReceive = (value: T) => {\n this.patrons.forEach((target) => {\n this.sendValueToGuest(value, target);\n });\n };\n this.give = (value: T) => {\n doReceive(value);\n return this;\n };\n notifyPoolsChange();\n }\n\n public size(): number {\n return this.patrons.size;\n }\n\n public add(shouldBePatron: GuestType<T>) {\n if (!shouldBePatron) {\n throw new Error(\"PatronPool add method received nothing!\");\n }\n if (\n typeof shouldBePatron !== \"function\" &&\n shouldBePatron.introduction &&\n shouldBePatron.introduction() === \"patron\"\n ) {\n this.patrons.add(shouldBePatron);\n }\n notifyPoolsChange();\n return this;\n }\n\n public remove(patron: GuestObjectType<T>) {\n this.patrons.delete(patron);\n notifyPoolsChange();\n return this;\n }\n\n public distribute(receiving: T, possiblePatron: GuestType<T>): this {\n this.add(possiblePatron);\n this.sendValueToGuest(receiving, possiblePatron);\n return this;\n }\n\n public destroy() {\n this.patrons.forEach((patron) => {\n this.remove(patron);\n });\n poolSets.delete(this);\n poolsOfInitiators.delete(this.initiator);\n notifyPoolsChange();\n return this;\n }\n\n private sendValueToGuest(value: T, guest: GuestType<T>) {\n const isDisposed = this.guestDisposed(value, guest);\n if (!isDisposed) {\n give(value, guest);\n }\n return this;\n }\n\n private guestDisposed(value: T, guest: GuestType<T>) {\n if ((guest as GuestDisposableType).disposed?.(value)) {\n this.remove(guest as GuestObjectType);\n return true;\n }\n return false;\n }\n}\n","import { introduction } from \"../Patron/Patron\";\nimport { GuestObjectType, GuestType } from \"../Guest/Guest\";\nimport { guestApplied } from \"../Guest/GuestApplied\";\n\n/**\n * Helps to apply function to patron\n * @url https://silentium-lab.github.io/silentium/#/patron/patron-applied\n */\nexport const patronApplied = <T, R>(\n baseGuest: GuestType<R>,\n applier: (value: T) => R,\n): GuestObjectType<T> => {\n const applied = guestApplied(baseGuest, applier);\n\n const result = {\n give(value: T) {\n applied.give(value);\n return result;\n },\n introduction,\n };\n\n return result;\n};\n","import { introduction } from \"../Patron/Patron\";\nimport { GuestExecutorType, GuestType } from \"../Guest/Guest\";\nimport { guestExecutorApplied } from \"../Guest/GuestExecutorApplied\";\n\n/**\n * Helps to apply function to patrons executor\n * @url https://silentium-lab.github.io/silentium/#/patron/patron-executor-applied\n */\nexport const patronExecutorApplied = <T>(\n baseGuest: GuestType<T>,\n applier: (executor: GuestExecutorType) => GuestExecutorType,\n) => {\n const guestApplied = guestExecutorApplied(baseGuest, applier);\n\n const result = {\n give(value: T) {\n guestApplied.give(value);\n return result;\n },\n introduction,\n };\n\n return result;\n};\n","import { subSource } from \"../Patron/PatronPool\";\nimport { GuestType } from \"../Guest/Guest\";\nimport { guestSync } from \"../Guest/GuestSync\";\nimport { patron } from \"../Patron/Patron\";\nimport { SourceObjectType, SourceType, value } from \"../Source/Source\";\n\n/**\n * Helps to represent source value as sync value, what can be returned\n * useful for example in tests\n * @url https://silentium-lab.github.io/silentium/#/source/source-sync\n */\nexport const sourceSync = <T>(\n baseSource: SourceType<T>,\n defaultValue?: unknown,\n): SourceObjectType<T> & { syncValue(): T } => {\n const syncGuest = guestSync<T>(defaultValue as T);\n value(baseSource, patron(syncGuest));\n\n const result = {\n value(guest: GuestType<T>) {\n value(baseSource, guest);\n return this;\n },\n syncValue() {\n try {\n return syncGuest.value() as T;\n } catch {\n throw new Error(\"No value in SourceSync\");\n }\n },\n };\n\n subSource(result, baseSource);\n\n return result;\n};\n","import { sourceSync } from \"../Source/SourceSync\";\nimport { give, guest, GuestObjectType, GuestType } from \"../Guest/Guest\";\nimport { isPatron } from \"../Patron/Patron\";\nimport { patronOnce } from \"../Patron/PatronOnce\";\nimport { PatronPool } from \"../Patron/PatronPool\";\nimport {\n isSource,\n SourceDataType,\n SourceObjectType,\n SourceType,\n value,\n} from \"./Source\";\n\nexport type SourceChangeableType<T = any> = SourceObjectType<T> &\n GuestObjectType<T>;\n\nconst sourceIsEmpty = (source: unknown) =>\n source === undefined || source === null;\n\n/**\n * Ability to create source what can be changed later\n * @url https://silentium-lab.github.io/silentium/#/source/source-of\n */\nexport const sourceOf = <T>(source?: SourceType<T>) => {\n const createdSource = {} as SourceChangeableType<T>;\n const thePool = new PatronPool(createdSource);\n let isEmpty = sourceIsEmpty(source);\n\n if (!isEmpty && isSource(source)) {\n value(\n source,\n patronOnce((unwrappedSourceDocument) => {\n isEmpty = sourceIsEmpty(unwrappedSourceDocument);\n source = unwrappedSourceDocument as SourceDataType<T>;\n }),\n );\n }\n\n createdSource.value = (g: GuestType<T>) => {\n if (isEmpty) {\n if (isPatron(g)) {\n thePool.add(g);\n }\n return createdSource;\n }\n\n if (typeof g === \"function\") {\n thePool.distribute(source, guest(g));\n } else {\n thePool.distribute(source, g);\n }\n\n return createdSource;\n };\n\n createdSource.give = (value: T) => {\n isEmpty = sourceIsEmpty(value);\n source = value as SourceDataType<T>;\n\n if (!isEmpty) {\n thePool.give(source);\n }\n\n return createdSource;\n };\n\n return createdSource as SourceChangeableType<T>;\n};\n\n/**\n * Changeable source what can be changed only once with specified value\n * @url https://silentium-lab.github.io/silentium/#/source/source-memo-of\n */\nexport const sourceMemoOf = <T>(\n source?: SourceType<T>,\n): SourceChangeableType<T> => {\n const result = sourceOf(source);\n const baseSrcSync = sourceSync(result, null);\n\n const resultMemo = {\n value: result.value,\n give(value: T) {\n if (baseSrcSync.syncValue() !== value) {\n give(value, result.give);\n }\n return resultMemo;\n },\n };\n\n return resultMemo;\n};\n","import { removePatronFromPools, subSource } from \"../Patron/PatronPool\";\nimport { give, guest, GuestObjectType, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { patron } from \"../Patron/Patron\";\nimport { SourceObjectType, SourceType, value } from \"./Source\";\nimport { sourceOf } from \"./SourceChangeable\";\nimport { DestroyableType } from \"src/Source/SourceDestroyable\";\n\ntype ExtractType<T> = T extends SourceType<infer U> ? U : never;\n\nexport type ExtractTypesFromArray<T extends SourceType<any>[]> = {\n [K in keyof T]: ExtractType<T[K]>;\n};\n\n/**\n * Represents common value as Array of bunch of sources,\n * when all sources will gets it's values\n * @url https://silentium-lab.github.io/silentium/#/source/source-all\n */\nexport const sourceAll = <const T extends SourceType[]>(\n sources: T,\n): SourceObjectType<ExtractTypesFromArray<T>> & DestroyableType => {\n const keysKnown = new Set<string>(Object.keys(sources));\n const keysFilled = new Set();\n const isAllFilled = () => {\n return keysFilled.size > 0 && keysFilled.size === keysKnown.size;\n };\n const theAll = sourceOf({});\n const patrons: GuestObjectType[] = [];\n\n Object.entries(sources).forEach(([key, source]) => {\n subSource(theAll, source);\n keysKnown.add(key);\n const keyPatron = patron((v) => {\n theAll.value(\n guest((all: Record<string, unknown>) => {\n keysFilled.add(key);\n const lastAll = {\n ...all,\n [key]: v,\n };\n theAll.give(lastAll);\n }),\n );\n });\n patrons.push(keyPatron);\n value(source, keyPatron);\n });\n\n return {\n value(guest: GuestType<ExtractTypesFromArray<T>>) {\n const mbPatron = guestCast(guest, (value: T) => {\n if (isAllFilled()) {\n give(Object.values(value) as ExtractTypesFromArray<T>, guest);\n }\n });\n patrons.push(mbPatron);\n theAll.value(mbPatron);\n },\n destroy() {\n patrons.forEach((patron) => {\n removePatronFromPools(patron);\n });\n },\n };\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { patronOnce } from \"../Patron/PatronOnce\";\nimport { LazyType } from \"../Lazy/Lazy\";\nimport { isSource, SourceType, value } from \"./Source\";\nimport { sourceAll } from \"./SourceAll\";\nimport { sourceOf, SourceChangeableType } from \"./SourceChangeable\";\n\n/**\n * Ability to apply source to source of array values sequentially\n * @url https://silentium-lab.github.io/silentium/#/source/source-sequence\n */\nexport const sourceSequence = <T, TG>(\n baseSource: SourceType<T[]>,\n targetSource: LazyType<SourceType<TG>>,\n) => {\n if (baseSource === undefined) {\n throw new Error(\"SourceSequence didn't receive baseSource argument\");\n }\n if (targetSource === undefined) {\n throw new Error(\"SourceSequence didn't receive targetSource argument\");\n }\n\n return (guest: GuestType<TG[]>) => {\n const sequenceSource = sourceOf();\n const source = targetSource.get(sequenceSource);\n\n value(\n baseSource,\n guestCast(guest, (theValue) => {\n let index = 0;\n\n const sources: SourceChangeableType[] = [];\n theValue.forEach(() => {\n sources.push(sourceOf());\n });\n\n const nextItemHandle = () => {\n if (theValue[index + 1] !== undefined) {\n index = index + 1;\n handle();\n }\n };\n\n function handle() {\n const currentSource = sources[index];\n const nextValue = theValue[index];\n if (isSource(nextValue)) {\n value(\n nextValue,\n patronOnce((theNextValue) => {\n sequenceSource.give(theNextValue);\n value(source, currentSource);\n nextItemHandle();\n }),\n );\n } else {\n sequenceSource.give(nextValue);\n value(source, currentSource);\n nextItemHandle();\n }\n }\n\n if (theValue[index] !== undefined) {\n handle();\n value(sourceAll(sources), guest);\n } else {\n give([], guest);\n }\n }),\n );\n };\n};\n","import { patron } from \"../Patron/Patron\";\nimport { patronOnce } from \"../Patron/PatronOnce\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\nimport { give } from \"../Guest/Guest\";\nimport { LazyType } from \"../Lazy/Lazy\";\nimport { destroy, subSource } from \"../Patron/PatronPool\";\nimport { SourceType, value } from \"./Source\";\nimport { sourceAll } from \"./SourceAll\";\n\n/**\n * Helps to modify many sources with one private source\n * @url https://silentium-lab.github.io/silentium/#/source/source-map\n */\nexport const sourceMap = <T, TG>(\n baseSource: SourceType<T[]>,\n targetSource: LazyType<SourceType<TG>>,\n) => {\n if (baseSource === undefined) {\n throw new Error(\"SourceMap didn't receive baseSource argument\");\n }\n if (targetSource === undefined) {\n throw new Error(\"SourceMap didn't receive targetSource argument\");\n }\n\n const result = sourceOf<TG[]>();\n\n value(\n baseSource,\n patron((theValue) => {\n const sources: SourceType[] = [];\n theValue.forEach((val) => {\n const source = targetSource.get(val);\n subSource(source, baseSource);\n sources.push(source);\n });\n value(\n sourceAll(sources),\n patronOnce((v) => {\n destroy(...sources);\n give(v, result);\n }),\n );\n }),\n );\n\n return result.value;\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { SourceType, value } from \"./Source\";\n\n/**\n * Connects guest with source what give response faster than others\n * @url https://silentium-lab.github.io/silentium/#/source/source-race\n */\nexport const sourceRace = <T>(sources: SourceType<T>[]) => {\n if (sources === undefined) {\n throw new Error(\"SourceRace didnt receive sources argument\");\n }\n\n return (guest: GuestType<T>) => {\n let connectedWithSource: SourceType | null = null;\n sources.forEach((source) => {\n value(\n source,\n guestCast(<GuestType>guest, (value) => {\n if (!connectedWithSource || connectedWithSource === source) {\n give(value as T, guest);\n connectedWithSource = source;\n }\n }),\n );\n });\n };\n};\n","import { patron } from \"../Patron/Patron\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype Last<T extends any[]> = T extends [...infer U, infer L] ? L : never;\n\n/**\n * Returns value of some source when all sources before it gives their response\n * @url https://silentium-lab.github.io/silentium/#/source/source-chain\n */\nexport const sourceChain = <T extends SourceType[]>(\n ...sources: T\n): SourceType<Last<T>> => {\n const resultSrc = sourceOf<Last<T>>();\n const respondedSources = new Set();\n let lastSourceValue: any = null;\n sources.forEach((source, index) => {\n value(\n source,\n patron((value) => {\n respondedSources.add(index);\n if (index === sources.length - 1) {\n lastSourceValue = value;\n }\n if (\n respondedSources.size === sources.length &&\n lastSourceValue !== null\n ) {\n resultSrc.give(lastSourceValue);\n }\n }),\n );\n });\n\n return resultSrc.value;\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { SourceType, value } from \"./Source\";\nimport { SourceChangeableType } from \"./SourceChangeable\";\n\n/**\n * Ability to build common changeable source from different guest and source\n * @url https://silentium-lab.github.io/silentium/#/source/source-dynamic\n */\nexport const sourceDynamic = <T>(\n baseGuest: GuestType<T>,\n baseSource: SourceType<T>,\n): SourceChangeableType<T> => {\n if (baseGuest === undefined) {\n throw new Error(\"SourceDynamic didn't receive baseGuest argument\");\n }\n if (baseSource === undefined) {\n throw new Error(\"SourceDynamic didn't receive baseSource argument\");\n }\n\n const sourceObject = {\n value(guest: GuestType<T>) {\n value(baseSource, guest);\n return sourceObject;\n },\n give(value: T) {\n give(value, baseGuest);\n return this;\n },\n };\n\n return sourceObject;\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { SourceType, value } from \"../Source/Source\";\n\n/**\n * Gives ability to apply function to source value\n * @url https://silentium-lab.github.io/silentium/#/source/source-applied\n */\nexport const sourceApplied = <T, R>(\n baseSource: SourceType<T>,\n applier: (v: T) => R,\n) => {\n return (guest: GuestType<R>) => {\n value(\n baseSource,\n guestCast(guest, (v) => {\n give(applier(v), guest);\n }),\n );\n };\n};\n","import { SourceExecutorType, SourceType, value } from \"../Source/Source\";\n\n/**\n * Ability to apply function to source executor, helpful when need to apply throttling or debounce\n * @url https://silentium-lab.github.io/silentium/#/source/source-executor-applied\n */\nexport const sourceExecutorApplied = <T>(\n source: SourceType<T>,\n applier: (executor: SourceExecutorType<T>) => SourceExecutorType<T>,\n) => {\n return applier((g) => {\n value(source, g);\n });\n};\n","import { give, GuestType } from \"../Guest/Guest\";\nimport { guestCast } from \"../Guest/GuestCast\";\nimport { SourceType, value } from \"../Source/Source\";\n\n/**\n * Helps not to respond with information what checked by predicate function\n * @url https://silentium-lab.github.io/silentium/#/source/source-filtered\n */\nexport const sourceFiltered = <T>(\n baseSource: SourceType<T>,\n predicate: (v: T) => boolean,\n defaultValue?: T,\n) => {\n return (g: GuestType<T>) => {\n value(\n baseSource,\n guestCast(g, (v) => {\n if (predicate(v) === true) {\n give(v, g);\n } else if (defaultValue !== undefined) {\n give(defaultValue, g);\n }\n }),\n );\n };\n};\n","import { GuestType } from \"../Guest/Guest\";\nimport { SourceType, value } from \"./Source\";\nimport { sourceOf } from \"./SourceChangeable\";\n\n/**\n * Ability set the value only once\n * @url https://silentium-lab.github.io/silentium/#/source/source-once\n */\nexport const sourceOnce = <T>(initialValue?: SourceType<T>) => {\n let isFilled = initialValue !== undefined;\n const source = sourceOf(initialValue);\n\n return {\n value(guest: GuestType<T>) {\n value(source, guest);\n return this;\n },\n give(value: T) {\n if (!isFilled) {\n source.give(value);\n isFilled = true;\n }\n return this;\n },\n };\n};\n","import { GuestType } from \"../Guest/Guest\";\nimport { patron } from \"../Patron/Patron\";\nimport { subSourceMany } from \"../Patron/PatronPool\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { ExtractTypesFromArray, sourceAll } from \"../Source/SourceAll\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\n\n/**\n * Simplifies sources combination, when we need to create value depending on many sources\n * @url https://silentium-lab.github.io/silentium/#/source/source-combined\n */\nexport const sourceCombined =\n <const T extends SourceType[]>(...sources: T) =>\n <R>(\n source: (\n guest: GuestType<R>,\n ...sourcesValues: ExtractTypesFromArray<T>\n ) => void,\n ): SourceType<R> => {\n const result = sourceOf<R>();\n subSourceMany(result, sources);\n\n value(\n sourceAll(sources),\n patron((actualValues) => {\n source(result.give, ...actualValues);\n }),\n );\n\n return result.value;\n };\n","import { give } from \"../Guest/Guest\";\nimport { patron } from \"../Patron/Patron\";\nimport { subSource } from \"../Patron/PatronPool\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\n\n/**\n * @url https://silentium-lab.github.io/silentium/#/source/source-resettable\n */\nexport const sourceResettable = <T>(\n baseSrc: SourceType<T>,\n resettableSrc: SourceType<unknown>,\n) => {\n const result = sourceOf<T>();\n\n value(\n resettableSrc,\n patron(() => {\n give(null, result);\n }),\n );\n\n value(baseSrc, patron(result));\n subSource(result, baseSrc);\n\n return result;\n};\n","import { patron } from \"../Patron/Patron\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\n\n/**\n * Present source of value what was last appeared in any\n * of given sources, can be used as default value, when some source\n * don't respond\n * @url https://silentium-lab.github.io/silentium/#/source/source-any\n */\nexport const sourceAny = <T>(sources: SourceType<T>[]) => {\n const lastSrc = sourceOf<T>();\n sources.forEach((source) => {\n value(source, patron(lastSrc));\n });\n\n return lastSrc;\n};\n","import { GuestType } from \"src/Guest/Guest\";\nimport { LazyType } from \"../Lazy/Lazy\";\nimport { patron } from \"../Patron/Patron\";\nimport { destroy } from \"../Patron/PatronPool\";\nimport { SourceType, value } from \"../Source/Source\";\nimport { sourceAll } from \"../Source/SourceAll\";\nimport { sourceOf } from \"../Source/SourceChangeable\";\nimport { sourceResettable } from \"../Source/SourceResettable\";\n\n/**\n * Helps to build source only when all sources will give its values\n * and only after some guest visit source\n * @url https://silentium-lab.github.io/silentium/#/source/source-lazy\n */\nexport const sourceLazy = <T>(\n lazySrc: LazyType<SourceType<T>>,\n args: SourceType[],\n resetSrc?: SourceType<unknown>,\n) => {\n let instance: SourceType<T> | null = null;\n const result = sourceOf<T>();\n const resultResettable = sourceResettable(result, resetSrc ?? sourceOf());\n let wasInstantiated = false;\n\n const instantiate = () => {\n if (wasInstantiated) {\n return;\n }\n\n wasInstantiated = true;\n value(\n sourceAll(args),\n patron(() => {\n if (!instance) {\n instance = lazySrc.get(...args);\n value(instance, patron(result));\n }\n }),\n );\n };\n\n if (resetSrc) {\n value(\n resetSrc,\n patron(() => {\n destroy(instance);\n instance = null;\n }),\n );\n }\n\n return (g: GuestType<T>) => {\n instantiate();\n resultResettable.value(g);\n };\n};\n","import { SourceExecutorType, SourceObjectType } from \"./Source\";\n\nexport type DestructorType = () => void;\n\nexport interface DestroyableType {\n destroy: DestructorType;\n}\n\n/**\n * Ability to create sources that support special destruction logic\n * @url https://silentium-lab.github.io/silentium/#/source/source-destroyable\n */\nexport const sourceDestroyable = <T>(\n source: SourceExecutorType<T, DestructorType>,\n): SourceObjectType<T> & DestroyableType => {\n let destructor: DestructorType | null = null;\n return {\n value(g) {\n destructor = source(g);\n return this;\n },\n destroy() {\n if (destructor !== null && typeof destructor === \"function\") {\n destructor();\n }\n return this;\n },\n };\n};\n","import { LazyType } from \"./Lazy\";\n\ninterface Constructable<T> {\n new (...args: unknown[]): T;\n}\n\ninterface Prototyped<T> {\n prototype: T;\n}\n\nexport const lazyClass = <T>(\n constructorFn: Prototyped<T>,\n modules: Record<string, unknown> = {},\n): LazyType<T> => {\n if (constructorFn === undefined) {\n throw new Error(\"PrivateClass didn't receive constructorFn argument\");\n }\n\n return {\n get<R extends unknown[], CT = null>(...args: R): CT extends null ? T : CT {\n return new (constructorFn as Constructable<T>)(\n ...args,\n modules,\n ) as CT extends null ? T : CT;\n },\n };\n};\n","export interface LazyType<T> {\n get<R extends unknown[], CT = null>(...args: R): CT extends null ? T : CT;\n}\n\n/**\n * Helps to get lazy instance of dependency\n * @url https://silentium-lab.github.io/silentium/#/utils/lazy\n */\nexport const lazy = <T>(buildingFn: (...args: any[]) => T): LazyType<T> => {\n if (buildingFn === undefined) {\n throw new Error(\"lazy didn't receive buildingFn argument\");\n }\n\n return {\n get<R extends unknown[], CT = null>(...args: R): CT extends null ? T : CT {\n return buildingFn(...args) as CT extends null ? T : CT;\n },\n };\n};\n"],"names":["source","guest","subSource","value","patron"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { DestroyableType as DestroyableType$1 } from 'src/Source/SourceDestroyable';
2
+ import { GuestType as GuestType$1 } from 'src/Guest/Guest';
2
3
 
3
4
  type SourceExecutorType<T, R = unknown> = (guest: GuestType<T>) => R;
4
5
  interface SourceObjectType<T> {
@@ -112,6 +113,11 @@ type DestructorType = () => void;
112
113
  interface DestroyableType {
113
114
  destroy: DestructorType;
114
115
  }
116
+ /**
117
+ * Ability to create sources that support special destruction logic
118
+ * @url https://silentium-lab.github.io/silentium/#/source/source-destroyable
119
+ */
120
+ declare const sourceDestroyable: <T>(source: SourceExecutorType<T, DestructorType>) => SourceObjectType<T> & DestroyableType;
115
121
 
116
122
  /**
117
123
  * Helps debug the application and detect issues with frozen pools
@@ -317,13 +323,14 @@ declare const sourceAny: <T>(sources: SourceType<T>[]) => SourceChangeableType<T
317
323
 
318
324
  /**
319
325
  * Helps to build source only when all sources will give its values
326
+ * and only after some guest visit source
320
327
  * @url https://silentium-lab.github.io/silentium/#/source/source-lazy
321
328
  */
322
- declare const sourceLazy: <T>(lazySrc: LazyType<SourceType<T>>, args: SourceType[], resetSrc?: SourceType<unknown>) => SourceChangeableType<T>;
329
+ declare const sourceLazy: <T>(lazySrc: LazyType<SourceType<T>>, args: SourceType[], resetSrc?: SourceType<unknown>) => (g: GuestType$1<T>) => void;
323
330
 
324
331
  interface Prototyped<T> {
325
332
  prototype: T;
326
333
  }
327
334
  declare const lazyClass: <T>(constructorFn: Prototyped<T>, modules?: Record<string, unknown>) => LazyType<T>;
328
335
 
329
- export { type ExtractTypesFromArray, type GuestDisposableType, type GuestExecutorType, type GuestObjectType, type GuestType, type GuestValueType, type LazyType, type MaybeDisposableType, PatronPool, type PatronType, type PoolType, type SourceChangeableType, type SourceDataType, type SourceExecutorType, type SourceObjectType, type SourceType, destroy, give, guest, guestApplied, guestCast, guestDisposable, guestExecutorApplied, guestSync, introduction, isDestroyable, isGuest, isPatron, isPatronInPools, isSource, lazy, lazyClass, patron, patronApplied, patronExecutorApplied, patronOnce, patronPools, patronPoolsStatistic, removePatronFromPools, source, sourceAll, sourceAny, sourceApplied, sourceChain, sourceCombined, sourceDynamic, sourceExecutorApplied, sourceFiltered, sourceLazy, sourceMap, sourceMemoOf, sourceOf, sourceOnce, sourceRace, sourceResettable, sourceSequence, sourceSync, subSource, subSourceMany, value };
336
+ export { type DestroyableType, type DestructorType, type ExtractTypesFromArray, type GuestDisposableType, type GuestExecutorType, type GuestObjectType, type GuestType, type GuestValueType, type LazyType, type MaybeDisposableType, PatronPool, type PatronType, type PoolType, type SourceChangeableType, type SourceDataType, type SourceExecutorType, type SourceObjectType, type SourceType, destroy, give, guest, guestApplied, guestCast, guestDisposable, guestExecutorApplied, guestSync, introduction, isDestroyable, isGuest, isPatron, isPatronInPools, isSource, lazy, lazyClass, patron, patronApplied, patronExecutorApplied, patronOnce, patronPools, patronPoolsStatistic, removePatronFromPools, source, sourceAll, sourceAny, sourceApplied, sourceChain, sourceCombined, sourceDestroyable, sourceDynamic, sourceExecutorApplied, sourceFiltered, sourceLazy, sourceMap, sourceMemoOf, sourceOf, sourceOnce, sourceRace, sourceResettable, sourceSequence, sourceSync, subSource, subSourceMany, value };
package/dist/silentium.js CHANGED
@@ -712,15 +712,22 @@ const sourceLazy = (lazySrc, args, resetSrc) => {
712
712
  let instance = null;
713
713
  const result = sourceOf();
714
714
  const resultResettable = sourceResettable(result, resetSrc ?? sourceOf());
715
- value(
716
- sourceAll(args),
717
- patron(() => {
718
- if (!instance) {
719
- instance = lazySrc.get(...args);
720
- value(instance, patron(result));
721
- }
722
- })
723
- );
715
+ let wasInstantiated = false;
716
+ const instantiate = () => {
717
+ if (wasInstantiated) {
718
+ return;
719
+ }
720
+ wasInstantiated = true;
721
+ value(
722
+ sourceAll(args),
723
+ patron(() => {
724
+ if (!instance) {
725
+ instance = lazySrc.get(...args);
726
+ value(instance, patron(result));
727
+ }
728
+ })
729
+ );
730
+ };
724
731
  if (resetSrc) {
725
732
  value(
726
733
  resetSrc,
@@ -730,7 +737,26 @@ const sourceLazy = (lazySrc, args, resetSrc) => {
730
737
  })
731
738
  );
732
739
  }
733
- return resultResettable;
740
+ return (g) => {
741
+ instantiate();
742
+ resultResettable.value(g);
743
+ };
744
+ };
745
+
746
+ const sourceDestroyable = (source) => {
747
+ let destructor = null;
748
+ return {
749
+ value(g) {
750
+ destructor = source(g);
751
+ return this;
752
+ },
753
+ destroy() {
754
+ if (destructor !== null && typeof destructor === "function") {
755
+ destructor();
756
+ }
757
+ return this;
758
+ }
759
+ };
734
760
  };
735
761
 
736
762
  const lazyClass = (constructorFn, modules = {}) => {
@@ -758,5 +784,5 @@ const lazy = (buildingFn) => {
758
784
  };
759
785
  };
760
786
 
761
- export { PatronPool, destroy, give, guest, guestApplied, guestCast, guestDisposable, guestExecutorApplied, guestSync, introduction, isDestroyable, isGuest, isPatron, isPatronInPools, isSource, lazy, lazyClass, patron, patronApplied, patronExecutorApplied, patronOnce, patronPools, patronPoolsStatistic, removePatronFromPools, source, sourceAll, sourceAny, sourceApplied, sourceChain, sourceCombined, sourceDynamic, sourceExecutorApplied, sourceFiltered, sourceLazy, sourceMap, sourceMemoOf, sourceOf, sourceOnce, sourceRace, sourceResettable, sourceSequence, sourceSync, subSource, subSourceMany, value };
787
+ export { PatronPool, destroy, give, guest, guestApplied, guestCast, guestDisposable, guestExecutorApplied, guestSync, introduction, isDestroyable, isGuest, isPatron, isPatronInPools, isSource, lazy, lazyClass, patron, patronApplied, patronExecutorApplied, patronOnce, patronPools, patronPoolsStatistic, removePatronFromPools, source, sourceAll, sourceAny, sourceApplied, sourceChain, sourceCombined, sourceDestroyable, sourceDynamic, sourceExecutorApplied, sourceFiltered, sourceLazy, sourceMap, sourceMemoOf, sourceOf, sourceOnce, sourceRace, sourceResettable, sourceSequence, sourceSync, subSource, subSourceMany, value };
762
788
  //# sourceMappingURL=silentium.js.map