patron-oop 1.45.0 → 1.46.0

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 (140) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/patron.cjs +106 -35
  3. package/dist/patron.cjs.map +1 -1
  4. package/dist/patron.d.ts +40 -1
  5. package/dist/patron.js +103 -36
  6. package/dist/patron.js.map +1 -1
  7. package/dist/patron.min.js +1 -1
  8. package/dist/patron.min.mjs +1 -1
  9. package/dist/patron.min.mjs.map +1 -1
  10. package/dist/patron.mjs +103 -36
  11. package/dist/patron.mjs.map +1 -1
  12. package/docs/README.md +3 -0
  13. package/docs/assets/css/base.css +42 -0
  14. package/docs/assets/favicon/android-icon-144x144.png +0 -0
  15. package/docs/assets/favicon/android-icon-192x192.png +0 -0
  16. package/docs/assets/favicon/android-icon-36x36.png +0 -0
  17. package/docs/assets/favicon/android-icon-48x48.png +0 -0
  18. package/docs/assets/favicon/android-icon-72x72.png +0 -0
  19. package/docs/assets/favicon/android-icon-96x96.png +0 -0
  20. package/docs/assets/favicon/apple-icon-114x114.png +0 -0
  21. package/docs/assets/favicon/apple-icon-120x120.png +0 -0
  22. package/docs/assets/favicon/apple-icon-144x144.png +0 -0
  23. package/docs/assets/favicon/apple-icon-152x152.png +0 -0
  24. package/docs/assets/favicon/apple-icon-180x180.png +0 -0
  25. package/docs/assets/favicon/apple-icon-57x57.png +0 -0
  26. package/docs/assets/favicon/apple-icon-60x60.png +0 -0
  27. package/docs/assets/favicon/apple-icon-72x72.png +0 -0
  28. package/docs/assets/favicon/apple-icon-76x76.png +0 -0
  29. package/docs/assets/favicon/apple-icon-precomposed.png +0 -0
  30. package/docs/assets/favicon/apple-icon.png +0 -0
  31. package/docs/assets/favicon/browserconfig.xml +2 -0
  32. package/docs/assets/favicon/favicon-16x16.png +0 -0
  33. package/docs/assets/favicon/favicon-32x32.png +0 -0
  34. package/docs/assets/favicon/favicon-96x96.png +0 -0
  35. package/docs/assets/favicon/favicon.ico +0 -0
  36. package/docs/assets/favicon/manifest.json +41 -0
  37. package/docs/assets/favicon/ms-icon-144x144.png +0 -0
  38. package/docs/assets/favicon/ms-icon-150x150.png +0 -0
  39. package/docs/assets/favicon/ms-icon-310x310.png +0 -0
  40. package/docs/assets/favicon/ms-icon-70x70.png +0 -0
  41. package/docs/assets/img/404.jpg +0 -0
  42. package/docs/assets/img/angular_16.jpg +0 -0
  43. package/docs/assets/img/angular_32.jpg +0 -0
  44. package/docs/assets/img/eo_16.jpg +0 -0
  45. package/docs/assets/img/eo_big.png +0 -0
  46. package/docs/assets/img/github_16.jpg +0 -0
  47. package/docs/assets/img/logo.jpg +0 -0
  48. package/docs/assets/img/philosofy/observable.jpg +0 -0
  49. package/docs/assets/img/philosofy/responsible.jpg +0 -0
  50. package/docs/assets/img/philosofy/result.jpg +0 -0
  51. package/docs/assets/img/philosofy/tell.jpg +0 -0
  52. package/docs/assets/img/react_16.jpg +0 -0
  53. package/docs/assets/img/react_32.jpg +0 -0
  54. package/docs/assets/img/vue_16.jpg +0 -0
  55. package/docs/assets/img/vue_32.jpg +0 -0
  56. package/docs/assets/js/components/linkDynamic.mjs +11 -0
  57. package/docs/assets/js/components/linkReloadable.mjs +13 -0
  58. package/docs/assets/js/entrypoints/compatibility.mjs +31 -0
  59. package/docs/assets/js/entrypoints/components.mjs +2 -0
  60. package/docs/assets/js/entrypoints/examples.mjs +25 -0
  61. package/docs/assets/js/entrypoints/factory.mjs +20 -0
  62. package/docs/assets/js/entrypoints/guest.mjs +61 -0
  63. package/docs/assets/js/entrypoints/index.mjs +110 -0
  64. package/docs/assets/js/entrypoints/integrations.mjs +36 -0
  65. package/docs/assets/js/entrypoints/patron.mjs +46 -0
  66. package/docs/assets/js/entrypoints/source.mjs +76 -0
  67. package/docs/assets/js/entrypoints/terminology.mjs +51 -0
  68. package/docs/assets/js/entrypoints/utils.mjs +61 -0
  69. package/docs/assets/js/lib/StyleFetched.mjs +14 -0
  70. package/docs/assets/js/routing.mjs +110 -0
  71. package/docs/assets/schemes/dip.html +28 -0
  72. package/docs/favicon.ico +0 -0
  73. package/docs/index-dev.html +346 -0
  74. package/docs/index.html +346 -0
  75. package/docs/manifest.json +41 -0
  76. package/docs/pages/404.html +9 -0
  77. package/docs/pages/common/layout.html +17 -0
  78. package/docs/pages/compatibility/dip.html +82 -0
  79. package/docs/pages/compatibility/elegant-objects.html +373 -0
  80. package/docs/pages/compatibility/layout.html +17 -0
  81. package/docs/pages/examples/errors.html +167 -0
  82. package/docs/pages/examples/index.html +10 -0
  83. package/docs/pages/examples.html +41 -0
  84. package/docs/pages/factory/index.html +18 -0
  85. package/docs/pages/factory.html +36 -0
  86. package/docs/pages/guest/guest-applied.html +51 -0
  87. package/docs/pages/guest/guest-cast.html +219 -0
  88. package/docs/pages/guest/guest-disposable.html +147 -0
  89. package/docs/pages/guest/guest-executor-applied.html +65 -0
  90. package/docs/pages/guest/guest-object.html +101 -0
  91. package/docs/pages/guest/guest-pool.html +107 -0
  92. package/docs/pages/guest/guest-sync.html +66 -0
  93. package/docs/pages/guest/index.html +115 -0
  94. package/docs/pages/guest.html +59 -0
  95. package/docs/pages/index.html +72 -0
  96. package/docs/pages/integrations/angular.html +5 -0
  97. package/docs/pages/integrations/layout.html +17 -0
  98. package/docs/pages/integrations/react.html +7 -0
  99. package/docs/pages/integrations/vue.html +102 -0
  100. package/docs/pages/patron/index.html +140 -0
  101. package/docs/pages/patron/patron-applied.html +66 -0
  102. package/docs/pages/patron/patron-executor-applied.html +94 -0
  103. package/docs/pages/patron/patron-once.html +110 -0
  104. package/docs/pages/patron/patron-pool.html +99 -0
  105. package/docs/pages/patron.html +50 -0
  106. package/docs/pages/philosofy.html +210 -0
  107. package/docs/pages/source/index.html +167 -0
  108. package/docs/pages/source/source-active.html +113 -0
  109. package/docs/pages/source/source-all.html +129 -0
  110. package/docs/pages/source/source-applied.html +73 -0
  111. package/docs/pages/source/source-dynamic.html +93 -0
  112. package/docs/pages/source/source-executor-applied.html +64 -0
  113. package/docs/pages/source/source-map.html +192 -0
  114. package/docs/pages/source/source-once.html +73 -0
  115. package/docs/pages/source/source-race.html +171 -0
  116. package/docs/pages/source/source-sequence.html +160 -0
  117. package/docs/pages/source/source-with-pool.html +102 -0
  118. package/docs/pages/source/source.html +167 -0
  119. package/docs/pages/source.html +68 -0
  120. package/docs/pages/terminology/guest.html +14 -0
  121. package/docs/pages/terminology/index.html +6 -0
  122. package/docs/pages/terminology/introduction.html +25 -0
  123. package/docs/pages/terminology/patron.html +10 -0
  124. package/docs/pages/terminology/source.html +55 -0
  125. package/docs/pages/terminology/visitor.html +19 -0
  126. package/docs/pages/terminology.html +53 -0
  127. package/docs/pages/utils/give.html +47 -0
  128. package/docs/pages/utils/index.html +24 -0
  129. package/docs/pages/utils/is-guest-aware.html +22 -0
  130. package/docs/pages/utils/is-guest.html +21 -0
  131. package/docs/pages/utils/is-patron-in-pools.html +53 -0
  132. package/docs/pages/utils/private.html +44 -0
  133. package/docs/pages/utils/remove-patron-from-pools.html +57 -0
  134. package/docs/pages/utils/value.html +47 -0
  135. package/docs/pages/utils.html +61 -0
  136. package/eslint.config.mjs +6 -0
  137. package/package.json +1 -1
  138. package/src/Patron/PatronApplied.ts +22 -0
  139. package/src/Patron/PatronExecutorApplied.ts +25 -0
  140. package/src/index.ts +4 -0
@@ -0,0 +1,129 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс SourceAll</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Guest/SourceAll.ts"
5
+ target="_blank"
6
+ class="inline-flex gap-1 items-center bg-gray-100 border-0 py-1 px-3 focus:outline-none hover:bg-gray-200 rounded text-base mt-4 md:mt-0 mb-4"
7
+ >
8
+ <img
9
+ src="./assets/img/github_16.jpg"
10
+ width="16"
11
+ height="16"
12
+ />
13
+ SourceAll на GitHub
14
+ </a>
15
+
16
+ <p class="text-gray-600 text-lg mb-4">
17
+ Предназначен для объединения результатов из нескольких
18
+ <span class="dynamic-navigation">
19
+ <a
20
+ class="inline-block whitespace-nowrap rounded-[0.27rem] bg-primary-100 px-[0.65em] pb-[0.25em] pt-[0.35em] text-center align-baseline text-[0.75em] font-bold leading-none text-white bg-slate-900"
21
+ href="/terminology/the-source"
22
+ >
23
+ источников данных
24
+ </a>
25
+ </span>
26
+ в один источник
27
+ </p>
28
+
29
+ <p class="text-gray-600 text-lg mb-4">
30
+ Полезное поведение в случаях, когда есть множество источников данных, на
31
+ основе которых нужно принимать решение в момент, когда все источники отдадут
32
+ свои данные
33
+ </p>
34
+
35
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
36
+ <pre class="mb-4"><code class="language-js">import {
37
+ Source,
38
+ SourceAll
39
+ } from 'patron-oop';
40
+
41
+ const one = new Source(1);
42
+ const two = new Source(2);
43
+
44
+ const all = new SourceAll();
45
+ one.value(all.guestKey('one'));
46
+ two.value(all.guestKey('two'));
47
+
48
+ all.value(({one, two}) => {
49
+ document
50
+ .querySelector('.guest-result')
51
+ .textContent = `Результат = ${one + two}`;
52
+ });
53
+ </code></pre>
54
+
55
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
56
+ <div class="example mb-4">
57
+ <span class="guest-result">Результат = 0</span>
58
+ </div>
59
+ <script type="module">
60
+ import { give, Patron, SourceWithPool, GuestCast, SourceAll } from "patron-oop";
61
+
62
+ const one = new SourceWithPool(1);
63
+ const two = new SourceWithPool(2);
64
+
65
+ const all = new SourceAll();
66
+ one.value(all.guestKey("one"));
67
+ two.value(all.guestKey("two"));
68
+
69
+ all.value(({ one, two }) => {
70
+ document.querySelector(".guest-result").textContent = `Результат = ${
71
+ one + two
72
+ }`;
73
+ });
74
+ </script>
75
+
76
+ <p class="text-gray-600 text-lg mb-4">
77
+ Также предусмотрена возможность собрать результаты в массив а не объект.
78
+ </p>
79
+
80
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
81
+ <pre class="mb-4"><code class="language-js">import {
82
+ SourceWithPool,
83
+ SourceAll
84
+ } from 'patron-oop';
85
+
86
+ const one = new SourceWithPool(1);
87
+ const two = new SourceWithPool(2);
88
+
89
+ const all = new SourceAll();
90
+ one.value(all.guestKey('0'));
91
+ two.value(all.guestKey('1'));
92
+
93
+ all.valueArray((numbers) => {
94
+ document.querySelector('.guest-result-array').textContent = `Результат = ${numbers}`;
95
+ });
96
+ </code></pre>
97
+
98
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
99
+ <div class="example mb-4">
100
+ <span class="guest-result-array">Результат = 0</span>
101
+ </div>
102
+ <script type="module">
103
+ import { give, Patron, SourceWithPool, GuestCast, SourceAll } from "patron-oop";
104
+
105
+ (() => {
106
+ const one = new SourceWithPool(1);
107
+ const two = new SourceWithPool(2);
108
+
109
+ const all = new SourceAll();
110
+ one.value(all.guestKey("0"));
111
+ two.value(all.guestKey("1"));
112
+
113
+ all.valueArray((numbers) => {
114
+ document.querySelector(
115
+ ".guest-result-array"
116
+ ).textContent = `Результат = ${numbers}`;
117
+ });
118
+ })();
119
+ </script>
120
+
121
+ <div class="font-bold mt-8">Смотрите также</div>
122
+
123
+ <p class="text-gray-600 text-lg mb-4 dynamic-navigation">
124
+ <a
125
+ class="inline-block whitespace-nowrap rounded-[0.27rem] bg-primary-100 px-[0.65em] pb-[0.25em] pt-[0.35em] text-center align-baseline text-[0.75em] font-bold leading-none text-white bg-slate-900"
126
+ href="/source"
127
+ >Source</a
128
+ >
129
+ </p>
@@ -0,0 +1,73 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс SourceApplied</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/SourceApplied.ts"
5
+ target="_blank"
6
+ class="inline-flex gap-1 items-center bg-gray-100 border-0 py-1 px-3 focus:outline-none hover:bg-gray-200 rounded text-base mt-4 md:mt-0 mb-4"
7
+ >
8
+ <img
9
+ src="./assets/img/github_16.jpg"
10
+ width="16"
11
+ height="16"
12
+ />
13
+ SourceApplied на GitHub
14
+ </a>
15
+
16
+ <p class="text-gray-600 text-lg mb-4">
17
+ Иногда к занчению источника нужно применить какую-нибудь существующую функцию, для этого можно использовать класс SourceApplied
18
+ </p>
19
+
20
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
21
+ <pre
22
+ class="mb-4"
23
+ ><code class="language-js">import { Source, SourceApplied, Patron } from "patron-oop";
24
+
25
+ const guest = v => {
26
+ const r = document.querySelector(".guest-result");
27
+ if (r) {
28
+ r.textContent = v;
29
+ }
30
+ }
31
+
32
+ const max = 10;
33
+ let iterations = 0;
34
+ const timer = new Source((g) => {
35
+ const tick = () => {
36
+ iterations++;
37
+ g.give(iterations);
38
+ setTimeout(tick, 1000);
39
+ }
40
+ tick();
41
+ });
42
+
43
+ new SourceApplied(timer, x => x * 2).value(new Patron(guest));
44
+ </code></pre>
45
+
46
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
47
+ <div class="example mb-4">
48
+ <span class="guest-result">Через 1 сек...</span>
49
+ </div>
50
+
51
+ <script type="module">
52
+ import { Source, SourceApplied, Patron } from "patron-oop";
53
+
54
+ const guest = v => {
55
+ const r = document.querySelector(".guest-result");
56
+ if (r) {
57
+ r.textContent = v;
58
+ }
59
+ }
60
+
61
+ const max = 10;
62
+ let iterations = 0;
63
+ const timer = new Source((g) => {
64
+ const tick = () => {
65
+ iterations++;
66
+ g.give(iterations);
67
+ setTimeout(tick, 1000);
68
+ }
69
+ tick();
70
+ });
71
+
72
+ new SourceApplied(timer, x => x * 2).value(new Patron(guest));
73
+ </script>
@@ -0,0 +1,93 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс SourceDynamic</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/SourceDynamic.ts"
5
+ target="_blank"
6
+ class="inline-flex gap-1 items-center bg-gray-100 border-0 py-1 px-3 focus:outline-none hover:bg-gray-200 rounded text-base mt-4 md:mt-0 mb-4"
7
+ >
8
+ <img
9
+ src="./assets/img/github_16.jpg"
10
+ width="16"
11
+ height="16"
12
+ />
13
+ SourceDynamic на GitHub
14
+ </a>
15
+
16
+ <p class="text-gray-600 text-lg mb-4">
17
+ Иногда необходимо соединить разные объекты
18
+ <link-dynamic href="/terminology/the-source">источник данных</link-dynamic>
19
+ и <link-dynamic href="/terminology/visitor">посетитель</link-dynamic> в одном
20
+ объекте как общий источник данных, который можно изменять
21
+ </p>
22
+
23
+ <p class="text-gray-600 text-lg mb-4">
24
+ Например, источником данных структуры <b>Х</b> может быть объект <b>А</b>, а
25
+ посетителем, получающим новую версию структуры <b>X</b> может быть объект
26
+ <b>B</b>. В таком случае можно объединить объекты <b>A</b> и <b>B</b> в один
27
+ общий SourceType, что упростит манипуляции над структурой <b>X</b>
28
+ </p>
29
+
30
+ <p class="text-gray-600 text-lg mb-4">
31
+ Для таких случаев подходит класс SourceDynamic объединяющий
32
+ <link-reloadable
33
+ target-blank
34
+ href="https://github.com/kosukhin/patron/blob/main/src/Guest/Guest.ts#L17"
35
+ >
36
+ GuestType
37
+ </link-reloadable>
38
+ и
39
+ <link-reloadable
40
+ target-blank
41
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/Source.ts#L3"
42
+ >
43
+ SourceType
44
+ </link-reloadable>
45
+ </p>
46
+
47
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
48
+ <pre
49
+ class="mb-4"
50
+ ><code class="language-js">import { SourceDynamic, Guest, Source } from "patron-oop";
51
+
52
+ let theValue = 1;
53
+ const sourceDynamic = new SourceDynamic(
54
+ new Guest((value) => {
55
+ theValue = value;
56
+ }),
57
+ new Source((guest) => {
58
+ give(theValue, guest);
59
+ })
60
+ );
61
+
62
+ sourceDynamic.give(42);
63
+ sourceDynamic.value((value) => {
64
+ document.querySelector(
65
+ ".source-dynamic-result"
66
+ ).textContent = `Результат = ${value}`;
67
+ });
68
+ </code></pre>
69
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
70
+ <div class="example mb-4">
71
+ <div class="source-dynamic-result">Нет результата!</div>
72
+ </div>
73
+
74
+ <script type="module">
75
+ import { SourceDynamic, Guest, Source, give } from "patron-oop";
76
+
77
+ let theValue = 1;
78
+ const sourceDynamic = new SourceDynamic(
79
+ new Guest((value) => {
80
+ theValue = value;
81
+ }),
82
+ new Source((guest) => {
83
+ give(theValue, guest);
84
+ })
85
+ );
86
+
87
+ sourceDynamic.give(42);
88
+ sourceDynamic.value((value) => {
89
+ document.querySelector(
90
+ ".source-dynamic-result"
91
+ ).textContent = `Результат = ${value}`;
92
+ });
93
+ </script>
@@ -0,0 +1,64 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс SourceExecutorApplied</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/SourceExecutorApplied.ts"
5
+ target="_blank"
6
+ class="inline-flex gap-1 items-center bg-gray-100 border-0 py-1 px-3 focus:outline-none hover:bg-gray-200 rounded text-base mt-4 md:mt-0 mb-4"
7
+ >
8
+ <img
9
+ src="./assets/img/github_16.jpg"
10
+ width="16"
11
+ height="16"
12
+ />
13
+ SourceExecutorApplied на GitHub
14
+ </a>
15
+
16
+ <p class="text-gray-600 text-lg mb-4">
17
+ Класс SourceExecutorApplied полезен когда нужно ограничить процесс отдачи значения посетителям, например
18
+ можно отложить отдачу значения на какое-то время, либо применить функции debounce или throttle
19
+ </p>
20
+
21
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
22
+ <pre
23
+ class="mb-4"
24
+ ><code class="language-js">import { SourceExecutorApplied, Patron, sourceOf, value } from "patron-oop";
25
+
26
+ const guest = v => {
27
+ const r = document.querySelector(".guest-result");
28
+ if (r) {
29
+ r.textContent = v;
30
+ }
31
+ }
32
+
33
+ new SourceExecutorApplied(sourceOf(40), (source) => {
34
+ return (g) => {
35
+ setTimeout(() => {
36
+ value(source, g);
37
+ }, 5000);
38
+ };
39
+ }).value(new Patron(guest));
40
+ </code></pre>
41
+
42
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
43
+ <div class="example mb-4">
44
+ <span class="guest-result">Через 5 сек...</span>
45
+ </div>
46
+
47
+ <script type="module">
48
+ import { SourceExecutorApplied, Patron, sourceOf, value } from "patron-oop";
49
+
50
+ const guest = v => {
51
+ const r = document.querySelector(".guest-result");
52
+ if (r) {
53
+ r.textContent = v;
54
+ }
55
+ }
56
+
57
+ new SourceExecutorApplied(sourceOf(40), (source) => {
58
+ return (g) => {
59
+ setTimeout(() => {
60
+ value(source, g);
61
+ }, 5000);
62
+ };
63
+ }).value(new Patron(guest));
64
+ </script>
@@ -0,0 +1,192 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс SourceMap</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/SourceMap.ts"
5
+ target="_blank"
6
+ class="inline-flex gap-1 items-center bg-gray-100 border-0 py-1 px-3 focus:outline-none hover:bg-gray-200 rounded text-base mt-4 md:mt-0 mb-4"
7
+ >
8
+ <img
9
+ src="./assets/img/github_16.jpg"
10
+ width="16"
11
+ height="16"
12
+ />
13
+ SourceMap на GitHub
14
+ </a>
15
+
16
+ <p class="text-gray-600 text-lg mb-4">
17
+ Класс <b>SourceMap</b> нужен в случаях обработки множества значений, через
18
+ создание на основе этих значений объектов -
19
+ <link-dynamic href="/terminology/the-source">источников данных</link-dynamic>.
20
+ Например у нас есть класс - результат умножения числа на 2. SourceMap
21
+ позволит применить этот класс к какому-то итерируемому источнику данных,
22
+ преобразовывая каждое значение в новое, в результате получим новый итерируемый
23
+ источник данных, в котором все числа умножены на 2.
24
+ </p>
25
+
26
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
27
+ <pre
28
+ class="mb-4"
29
+ ><code class="language-js">import { Source, SourceWithPool, GuestCast, SourceMap, PrivateClass, give } from "patron-oop";
30
+
31
+ class X2 {
32
+ constructor(baseNumber) {
33
+ this.baseNumber = baseNumber;
34
+ }
35
+
36
+ value(guest) {
37
+ this.baseNumber.value(
38
+ new GuestCast(guest, (v) => {
39
+ give(v * 2, guest);
40
+ })
41
+ );
42
+ return this;
43
+ }
44
+ }
45
+
46
+ const source = new SourceWithPool([1, 2, 3, 9]);
47
+ const guestMapped = new SourceMap(source, new PrivateClass(X2));
48
+
49
+ guestMapped.value((v) => {
50
+ document.querySelector(".guest-result").textContent = v.join();
51
+ });
52
+ </code></pre>
53
+
54
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
55
+ <div class="example mb-4">
56
+ <span class="guest-result">Result here</span>
57
+ </div>
58
+
59
+ <script type="module">
60
+ import { Source, SourceWithPool, GuestCast, SourceMap, PrivateClass, give } from "patron-oop";
61
+
62
+ class X2 {
63
+ constructor(baseNumber) {
64
+ this.baseNumber = baseNumber;
65
+ }
66
+
67
+ value(guest) {
68
+ this.baseNumber.value(
69
+ new GuestCast(guest, (v) => {
70
+ give(v * 2, guest);
71
+ })
72
+ );
73
+ return this;
74
+ }
75
+ }
76
+
77
+ const source = new SourceWithPool([1, 2, 3, 9]);
78
+ const guestMapped = new SourceMap(source, new PrivateClass(X2));
79
+
80
+ guestMapped.value((v) => {
81
+ document.querySelector(".guest-result").textContent = v.join();
82
+ });
83
+ </script>
84
+
85
+ <p class="text-gray-600 text-lg mb-4">
86
+ Так же можно передавать итерируемый источник источников данных. Благодаря
87
+ этому можно параллельно вычислить общий результат нескольких источников.
88
+ Пример использования ниже
89
+ </p>
90
+
91
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 2.</p>
92
+ <pre class="mb-4"><code class="language-js">import {
93
+ Source,
94
+ SourceWithPool,
95
+ GuestCast,
96
+ SourceMap,
97
+ PrivateClass,
98
+ give,
99
+ isSource,
100
+ } from "patron-oop";
101
+
102
+ (() => {
103
+ class X3 {
104
+ constructor(baseNumber) {
105
+ this.baseNumber = baseNumber;
106
+ }
107
+
108
+ value(guest) {
109
+ this.baseNumber.value(
110
+ new GuestCast(guest, (v) => {
111
+ give(v * 3, guest);
112
+ })
113
+ );
114
+ return this;
115
+ }
116
+ }
117
+
118
+ const numSource = (num) =>
119
+ new Source((guest) =>
120
+ setTimeout(() => {
121
+ give(num, guest);
122
+ }, 8000)
123
+ );
124
+
125
+ const source = new SourceWithPool([
126
+ numSource(1),
127
+ numSource(2),
128
+ numSource(3),
129
+ numSource(4),
130
+ numSource(5),
131
+ ]);
132
+ const map = new SourceMap(source, new PrivateClass(X3));
133
+
134
+ map.value((v) => {
135
+ document.querySelector(".guest-result-2").textContent = v.join();
136
+ });
137
+ })();
138
+ </code></pre>
139
+
140
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 2.</p>
141
+ <div class="example mb-4">
142
+ <span class="guest-result-2">Все результаты через 8 сек.</span>
143
+ </div>
144
+
145
+ <script type="module">
146
+ import {
147
+ Source,
148
+ SourceWithPool,
149
+ GuestCast,
150
+ SourceMap,
151
+ PrivateClass,
152
+ give,
153
+ isSource,
154
+ } from "patron-oop";
155
+
156
+ (() => {
157
+ class X3 {
158
+ constructor(baseNumber) {
159
+ this.baseNumber = baseNumber;
160
+ }
161
+
162
+ value(guest) {
163
+ this.baseNumber.value(
164
+ new GuestCast(guest, (v) => {
165
+ give(v * 3, guest);
166
+ })
167
+ );
168
+ return this;
169
+ }
170
+ }
171
+
172
+ const numSource = (num) =>
173
+ new Source((guest) =>
174
+ setTimeout(() => {
175
+ give(num, guest);
176
+ }, 8000)
177
+ );
178
+
179
+ const source = new SourceWithPool([
180
+ numSource(1),
181
+ numSource(2),
182
+ numSource(3),
183
+ numSource(4),
184
+ numSource(5),
185
+ ]);
186
+ const map = new SourceMap(source, new PrivateClass(X3));
187
+
188
+ map.value((v) => {
189
+ document.querySelector(".guest-result-2").textContent = v.join();
190
+ });
191
+ })();
192
+ </script>
@@ -0,0 +1,73 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс SourceOnce</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/SourceOnce.ts"
5
+ target="_blank"
6
+ class="inline-flex gap-1 items-center bg-gray-100 border-0 py-1 px-3 focus:outline-none hover:bg-gray-200 rounded text-base mt-4 md:mt-0 mb-4"
7
+ >
8
+ <img
9
+ src="./assets/img/github_16.jpg"
10
+ width="16"
11
+ height="16"
12
+ />
13
+ SourceOnce на GitHub
14
+ </a>
15
+
16
+ <p class="text-gray-600 text-lg mb-4">
17
+ Класс SourceOnce используется в случаях когда нужно создать источник данных в котором на
18
+ старте не будет значения, оно будет установлено позже но только один раз, последующие установки
19
+ новых значений будут игнорироваться.
20
+ </p>
21
+
22
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
23
+ <pre
24
+ class="mb-4"
25
+ ><code class="language-js">import { SourceOnce, Patron } from "patron-oop";
26
+
27
+ const source = new SourceOnce();
28
+
29
+ source.value(new Patron((v) => {
30
+ document.querySelector(".guest-result").textContent = v;
31
+ }));
32
+
33
+ setTimeout(() => {
34
+ source.give(10)
35
+ }, 1000);
36
+
37
+ // Код ниже не имеет эффекта
38
+ setTimeout(() => {
39
+ source.give(20)
40
+ }, 2000);
41
+
42
+ setTimeout(() => {
43
+ source.give(30)
44
+ }, 3000);
45
+ </code></pre>
46
+
47
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
48
+ <div class="example mb-4">
49
+ <span class="guest-result">Через 1 сек...</span>
50
+ </div>
51
+
52
+ <script type="module">
53
+ import { SourceOnce, Patron } from "patron-oop";
54
+
55
+ const source = new SourceOnce();
56
+
57
+ source.value(new Patron((v) => {
58
+ document.querySelector(".guest-result").textContent = v;
59
+ }));
60
+
61
+ setTimeout(() => {
62
+ source.give(10)
63
+ }, 1000);
64
+
65
+ // Код ниже не имеет эффекта
66
+ setTimeout(() => {
67
+ source.give(20)
68
+ }, 2000);
69
+
70
+ setTimeout(() => {
71
+ source.give(30)
72
+ }, 3000);
73
+ </script>