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,171 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс SourceRace</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Guest/SourceRace.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
+ SourceRace на 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
+ предназначенный для получения данных только от первого ответившего источника.
20
+ </p>
21
+
22
+ <p class="text-gray-600 text-lg mb-4">
23
+ Это поведение может быть очень полезным, чтобы избавиться от условий в
24
+ приложении. Благодаря классу SourceRace каждый источник данных может сам
25
+ решить должен ли он вообще отдавать какую-либо информацию или можно
26
+ промолчать.
27
+ </p>
28
+
29
+ <p class="text-gray-600 text-lg mb-4">
30
+ Для примера сделаем программу, которая будет умножать на 2 четные числа и на 3
31
+ нечетные
32
+ </p>
33
+
34
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
35
+ <pre class="mb-4"><code class="language-js">import {
36
+ SourceMap,
37
+ SourceRace,
38
+ Source,
39
+ SourceWithPool,
40
+ give,
41
+ value,
42
+ GuestCast,
43
+ Private,
44
+ } from "patron-oop";
45
+
46
+ const isEven = (v) => v % 2 === 0;
47
+ const isOdd = (v) => v % 2 !== 0;
48
+
49
+ const nTimesSource = (condition, n, baseSource) => (guest) => {
50
+ value(
51
+ baseSource,
52
+ new GuestCast(guest, (value) => {
53
+ if (condition(value)) {
54
+ give(value * n, guest);
55
+ }
56
+ })
57
+ );
58
+ };
59
+
60
+ const source = new SourceWithPool([1, 2, 3, 4, 5]);
61
+ const guestMapped = new SourceMap(
62
+ source,
63
+ new Private(
64
+ (itemSource) =>
65
+ new SourceRace([
66
+ nTimesSource(isEven, 2, itemSource),
67
+ nTimesSource(isOdd, 3, itemSource),
68
+ ])
69
+ )
70
+ );
71
+
72
+ guestMapped.value((v) => {
73
+ document.querySelector(".guest-result").textContent = v.join();
74
+ });
75
+ </code></pre>
76
+
77
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
78
+ <div class="example mb-4">
79
+ <span class="guest-result">Результат = 0</span>
80
+ </div>
81
+ <script type="module">
82
+ import {
83
+ SourceMap,
84
+ SourceRace,
85
+ Source,
86
+ SourceWithPool,
87
+ give,
88
+ value,
89
+ GuestCast,
90
+ Private,
91
+ } from "patron-oop";
92
+
93
+ const isEven = (v) => v % 2 === 0;
94
+ const isOdd = (v) => v % 2 !== 0;
95
+
96
+ const nTimesSource = (condition, n, baseSource) => (guest) => {
97
+ value(
98
+ baseSource,
99
+ new GuestCast(guest, (value) => {
100
+ if (condition(value)) {
101
+ give(value * n, guest);
102
+ }
103
+ })
104
+ );
105
+ };
106
+
107
+ const source = new SourceWithPool([1, 2, 3, 4, 5]);
108
+ const guestMapped = new SourceMap(
109
+ source,
110
+ new Private(
111
+ (itemSource) =>
112
+ new SourceRace([
113
+ nTimesSource(isEven, 2, itemSource),
114
+ nTimesSource(isOdd, 3, itemSource),
115
+ ])
116
+ )
117
+ );
118
+
119
+ guestMapped.value((v) => {
120
+ document.querySelector(".guest-result").textContent = v.join();
121
+ });
122
+ </script>
123
+
124
+ <p class="text-gray-600 text-lg mb-4">
125
+ В программе использованы классы и функции:
126
+ </p>
127
+
128
+ <ul>
129
+ <li>
130
+ <link-dynamic href="/terminology/the-source">SourceMap</link-dynamic>
131
+ - для применения источника на каждый элемент внутри итерируемого источника
132
+ </li>
133
+ <li>
134
+ <link-dynamic href="/terminology/the-source">SourceRace</link-dynamic>
135
+ - для оборачивания набора источников, которым подходит значение на текущем
136
+ цикле итерации.
137
+ </li>
138
+ <li>
139
+ <link-dynamic href="/terminology/the-source">Source</link-dynamic>
140
+ - для представления данных итерируемых
141
+ </li>
142
+ <li>
143
+ <link-dynamic href="/terminology/the-source">give</link-dynamic>
144
+ - для передачи данных источнику
145
+ </li>
146
+ <li>
147
+ <link-dynamic href="/terminology/the-source">value</link-dynamic>
148
+ - для получения данных от источника
149
+ </li>
150
+ <li>
151
+ <link-dynamic href="/terminology/the-source">GuestCast</link-dynamic>
152
+ - для наследования представления гостя, возможно данные нужны патрону
153
+ </li>
154
+ <li>
155
+ <link-dynamic href="/terminology/the-source">Private</link-dynamic>
156
+ - для объявления новой композиции
157
+ </li>
158
+ </ul>
159
+
160
+ <p>&nbsp;</p>
161
+ <p class="text-gray-600 text-lg mb-4">
162
+ Можно сказать, что код примера слишком сложный для такой простой задачи. Да
163
+ это правда, но пример показывает, что можно построить код таким образом, чтобы
164
+ классы или функции сами в зависимости от значения решали должны ли они
165
+ выполнять свою работу или нет
166
+ </p>
167
+
168
+ <p class="text-gray-600 text-lg mb-4">
169
+ Эта возможность - принимать решение давать свой ответ или нет внутри объектов
170
+ - может быть очень ценной для инкапсуляции логики и переиспользования
171
+ </p>
@@ -0,0 +1,160 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">
2
+ Класс SourceSequence
3
+ </h1>
4
+
5
+ <a
6
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/SourceSequence.ts"
7
+ target="_blank"
8
+ 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"
9
+ >
10
+ <img
11
+ src="./assets/img/github_16.jpg"
12
+ width="16"
13
+ height="16"
14
+ />
15
+ SourceSequence на GitHub
16
+ </a>
17
+
18
+ <p class="text-gray-600 text-lg mb-4">
19
+ Класс <b>SourceSequence</b> работает так же как и
20
+ <link-dynamic href="/source/source-map">SourceMap</link-dynamic>
21
+ , но перебирает источнники данных последовательно а не параллельно
22
+ </p>
23
+
24
+ <p class="text-gray-600 text-lg mb-4">
25
+ Такое поведение - последовательного перебора элементов может быть полезно либо
26
+ в случаях перебора синхронных данных, что позволяет экономить память не
27
+ оборачивая каждый источник данных в лишние объекты, либо в случаях когда по
28
+ бизнес логике нужно сделать последовательный перебор источников данных.
29
+ </p>
30
+
31
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
32
+ <pre class="mb-4"><code class="language-js">import {
33
+ Source,
34
+ Patron,
35
+ GuestCast,
36
+ SourceWithPool,
37
+ SourceSequence,
38
+ PrivateClass,
39
+ give,
40
+ isSource,
41
+ } from "patron-oop";
42
+
43
+ class X3 {
44
+ constructor(baseNumber) {
45
+ this.baseNumber = baseNumber;
46
+ }
47
+
48
+ value(guest) {
49
+ this.baseNumber.value(
50
+ new GuestCast(guest, (v) => {
51
+ give(v * 3, guest);
52
+ })
53
+ );
54
+ return this;
55
+ }
56
+ }
57
+
58
+ const tillResult = new SourceWithPool(9);
59
+ const numSource = (num) =>
60
+ new Source((guest) =>
61
+ setTimeout(() => {
62
+ tillResult.value((theValue) => {
63
+ tillResult.give(theValue - 1);
64
+ });
65
+ give(num, guest);
66
+ }, 1000)
67
+ );
68
+
69
+ const source = new SourceWithPool([
70
+ numSource(1),
71
+ numSource(2),
72
+ numSource(3),
73
+ numSource(4),
74
+ numSource(5),
75
+ numSource(6),
76
+ numSource(7),
77
+ numSource(8),
78
+ numSource(9),
79
+ ]);
80
+ const sequence = new SourceSequence(source, new PrivateClass(X3));
81
+
82
+ sequence.value((v) => {
83
+ document.querySelector(".guest-result").textContent = v.join();
84
+ });
85
+ tillResult.value(
86
+ new Patron((v) => {
87
+ document.querySelector(
88
+ ".guest-result"
89
+ ).textContent = `Результат через ${v} сек.`;
90
+ })
91
+ );
92
+ </code></pre>
93
+
94
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
95
+ <div class="example mb-4">
96
+ <span class="guest-result">Result here</span>
97
+ </div>
98
+
99
+ <script type="module">
100
+ import {
101
+ Source,
102
+ Patron,
103
+ GuestCast,
104
+ SourceWithPool,
105
+ SourceSequence,
106
+ PrivateClass,
107
+ give,
108
+ isSource,
109
+ } from "patron-oop";
110
+
111
+ class X3 {
112
+ constructor(baseNumber) {
113
+ this.baseNumber = baseNumber;
114
+ }
115
+
116
+ value(guest) {
117
+ this.baseNumber.value(
118
+ new GuestCast(guest, (v) => {
119
+ give(v * 3, guest);
120
+ })
121
+ );
122
+ return this;
123
+ }
124
+ }
125
+
126
+ const tillResult = new SourceWithPool(9);
127
+ const numSource = (num) =>
128
+ new Source((guest) =>
129
+ setTimeout(() => {
130
+ tillResult.value((theValue) => {
131
+ tillResult.give(theValue - 1);
132
+ });
133
+ give(num, guest);
134
+ }, 1000)
135
+ );
136
+
137
+ const source = new SourceWithPool([
138
+ numSource(1),
139
+ numSource(2),
140
+ numSource(3),
141
+ numSource(4),
142
+ numSource(5),
143
+ numSource(6),
144
+ numSource(7),
145
+ numSource(8),
146
+ numSource(9),
147
+ ]);
148
+ const sequence = new SourceSequence(source, new PrivateClass(X3));
149
+
150
+ sequence.value((v) => {
151
+ document.querySelector(".guest-result").textContent = v.join();
152
+ });
153
+ tillResult.value(
154
+ new Patron((v) => {
155
+ document.querySelector(
156
+ ".guest-result"
157
+ ).textContent = `Результат через ${v} сек.`;
158
+ })
159
+ );
160
+ </script>
@@ -0,0 +1,102 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс SourceWithPool</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/SourceWithPool.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
+ SourceWithPool на GitHub
14
+ </a>
15
+
16
+ <p class="text-gray-600 text-lg mb-4">
17
+ Предназначен для представления данных в виде&nbsp;<span
18
+ class="dynamic-navigation"
19
+ >
20
+ <a
21
+ 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"
22
+ href="/terminology/the-source"
23
+ >
24
+ источника
25
+ </a> </span
26
+ >, который умеет оповещать своих
27
+ <span class="dynamic-navigation">
28
+ <a
29
+ 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"
30
+ href="/terminology/the-patron"
31
+ >
32
+ патронов
33
+ </a>
34
+ </span>
35
+ об изменении данных
36
+ </p>
37
+
38
+ <p class="text-gray-600 text-lg mb-4">
39
+ Полезно в случаях, когда есть какие-то данные, которые могут изменяться со
40
+ временем. В этом случае данные полезно обернуть в SourceWithPool, чтобы посетители
41
+ данных могли сами решить нужно их уведомлять или не нужно и они сами себя
42
+ удалят из PatronPool внутри SourceWithPool
43
+ </p>
44
+
45
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
46
+ <pre class="mb-4"><code class="language-js">import { SourceWithPool, Patron } from "patron-oop";
47
+
48
+ const source = new SourceWithPool("один");
49
+ source.value((value) => {
50
+ document.querySelector(
51
+ ".source-result-1"
52
+ ).textContent = `Результат гостя = ${value}`;
53
+ });
54
+ source.value(
55
+ new Patron((value) => {
56
+ document.querySelector(
57
+ ".source-result-2"
58
+ ).textContent = `Результат патрона = ${value}`;
59
+ })
60
+ );
61
+
62
+ setTimeout(() => {
63
+ source.give("два");
64
+ });
65
+ </code></pre>
66
+
67
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
68
+ <div class="example mb-4">
69
+ <div class="source-result-1">Нет результата!</div>
70
+ <div class="source-result-2">Нет результата!</div>
71
+ </div>
72
+ <script type="module">
73
+ import { SourceWithPool, Patron } from "patron-oop";
74
+
75
+ const source = new SourceWithPool("один");
76
+ source.value((value) => {
77
+ document.querySelector(
78
+ ".source-result-1"
79
+ ).textContent = `Результат гостя = ${value}`;
80
+ });
81
+ source.value(
82
+ new Patron((value) => {
83
+ document.querySelector(
84
+ ".source-result-2"
85
+ ).textContent = `Результат патрона = ${value}`;
86
+ })
87
+ );
88
+
89
+ setTimeout(() => {
90
+ source.give("два");
91
+ });
92
+ </script>
93
+
94
+ <div class="font-bold mt-8">Смотрите также</div>
95
+
96
+ <p class="text-gray-600 text-lg mb-4 dynamic-navigation">
97
+ <a
98
+ 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"
99
+ href="/patron"
100
+ >Patron</a
101
+ >
102
+ </p>
@@ -0,0 +1,167 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс Source</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/Source.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
+ Source на 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
+ </p>
33
+
34
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
35
+ <pre class="mb-4"><code class="language-js">import {
36
+ Source,
37
+ give
38
+ } from 'patron-oop';
39
+
40
+ const timestamp = new Source((guest) => {
41
+ give(Date.now(), guest);
42
+ });
43
+ timestamp.value((timestamp) => {
44
+ console.log('timestamp is', timestamp);
45
+ });
46
+ </code></pre>
47
+
48
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
49
+ <div class="example mb-4">
50
+ <span class="guest-result">Result here</span>
51
+ </div>
52
+ <script type="module">
53
+ import { Source, give } from "patron-oop";
54
+
55
+ const timestamp = new Source((guest) => {
56
+ give(Date.now(), guest);
57
+ });
58
+ timestamp.value((timestamp) => {
59
+ document.querySelector(
60
+ ".guest-result"
61
+ ).textContent = `timestamp is ${timestamp}`;
62
+ });
63
+ </script>
64
+
65
+ <p class="text-gray-600 text-lg mb-4">
66
+ Источником данных может быть не только объект, но и функция вида
67
+ <em>(guest) => guest('value')</em>. Напрямую можно обратиться к такому
68
+ источнику через функцию
69
+ <link-reloadable
70
+ target-blank
71
+ href="https://github.com/kosukhin/patron/blob/main/src/Source/Source.ts#L11"
72
+ >
73
+ value
74
+ </link-reloadable>
75
+ </p>
76
+
77
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 2.</p>
78
+ <pre class="mb-4"><code class="language-js">import {
79
+ give,
80
+ value
81
+ } from "patron-oop";
82
+
83
+ const helloSource = (guest) => {
84
+ setTimeout(() => {
85
+ give("Hello world", guest);
86
+ }, 1000);
87
+ };
88
+
89
+ value(helloSource, (greeting) => {
90
+ document.querySelector(
91
+ ".guest-result-2"
92
+ ).textContent = `greeting is "${greeting}"`;
93
+ });
94
+ </code></pre>
95
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 2.</p>
96
+ <div class="example mb-4">
97
+ <span class="guest-result-2">Result here</span>
98
+ </div>
99
+ <script type="module">
100
+ import { give, value } from "patron-oop";
101
+
102
+ const helloSource = (guest) => {
103
+ setTimeout(() => {
104
+ give("Hello world", guest);
105
+ }, 1000);
106
+ };
107
+
108
+ value(helloSource, (greeting) => {
109
+ document.querySelector(
110
+ ".guest-result-2"
111
+ ).textContent = `greeting is "${greeting}"`;
112
+ });
113
+ </script>
114
+
115
+ <p class="text-gray-600 text-lg mb-4">
116
+ Или можно передать источник-функцию в виде зависимости объектам, которые
117
+ ожидают интерфейс SourceType, в примере ниже используется комбинация
118
+ <link-dynamic href="/guest/source-all">SourceAll</link-dynamic>
119
+ и источников-фукнций
120
+ </p>
121
+
122
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 3.</p>
123
+ <pre class="mb-4"><code class="language-js">import {
124
+ SourceAll,
125
+ give,
126
+ value
127
+ } from "patron-oop";
128
+
129
+ const all = new SourceAll();
130
+ value(give.bind(null, 1), all.guestKey("one"));
131
+ value(give.bind(null, 2), all.guestKey("two"));
132
+
133
+ all.value(({ one, two }) => {
134
+ document.querySelector(".guest-result-3").textContent = `one + two = "${
135
+ one + two
136
+ }"`;
137
+ });
138
+ </code></pre>
139
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 3.</p>
140
+ <div class="example mb-4">
141
+ <span class="guest-result-3">Result here</span>
142
+ </div>
143
+ <script type="module">
144
+ import { SourceAll, give, value } from "patron-oop";
145
+
146
+ const all = new SourceAll();
147
+ value(give.bind(null, 1), all.guestKey("one"));
148
+ value(give.bind(null, 2), all.guestKey("two"));
149
+
150
+ all.value(({ one, two }) => {
151
+ document.querySelector(".guest-result-3").textContent = `one + two = "${
152
+ one + two
153
+ }"`;
154
+ });
155
+ </script>
156
+
157
+ <p class="text-gray-600 text-lg mb-4">
158
+ Интересный факт, что с помощью частичного применения(bind) можно превратить
159
+ функцию <b>give</b> в <b>источник данных</b>, передав только первый аргумент
160
+ </p>
161
+
162
+ <div class="font-bold mt-8">Смотрите также</div>
163
+
164
+ <p class="text-gray-600 text-lg mb-4 dynamic-navigation">
165
+ <link-dynamic href="/utils/give">give</link-dynamic>
166
+ <link-dynamic href="/utils/value">value</link-dynamic>
167
+ </p>
@@ -0,0 +1,68 @@
1
+ <section class="text-gray-600 body-font">
2
+ <div class="py-1 mx-auto flex flex-col">
3
+ <div class="lg:w-4/6 mx-auto w-full">
4
+ <div class="flex flex-col sm:flex-row w-full">
5
+ <div class="sm:w-1/3 text-center w-full">
6
+ <div
7
+ class="flex flex-col items-center text-center justify-center source-menu"
8
+ >
9
+ <h2 class="font-medium title-font text-gray-900 text-lg">
10
+ <a href="/source"> Source </a>
11
+ </h2>
12
+ <div class="w-12 h-1 bg-indigo-500 rounded mt-2 mb-4"></div>
13
+ <ul class="text-gray-900">
14
+ <li class="w-full border-b-2 border-neutral-100 py-4">
15
+ <a href="/source/source-active"> SourceActive </a>
16
+ </li>
17
+ <li class="w-full border-b-2 border-neutral-100 py-4">
18
+ <a href="/source/source-all"> SourceAll </a>
19
+ </li>
20
+ <li class="w-full border-b-2 border-neutral-100 py-4">
21
+ <a href="/source/source-applied"> SourceApplied </a>
22
+ </li>
23
+ <li class="w-full border-b-2 border-neutral-100 py-4">
24
+ <a href="/source/source-dynamic"> SourceDynamic </a>
25
+ </li>
26
+ <li class="w-full border-b-2 border-neutral-100 py-4">
27
+ <a href="/source/source-executor-applied"> SourceExecutorApplied </a>
28
+ </li>
29
+ <li class="w-full border-b-2 border-neutral-100 py-4">
30
+ <a href="/source/source-map"> SourceMap </a>
31
+ </li>
32
+ <li class="w-full border-b-2 border-neutral-100 py-4">
33
+ <a href="/source/source-once"> SourceOnce </a>
34
+ </li>
35
+ <li class="w-full border-b-2 border-neutral-100 py-4">
36
+ <a href="/source/source-race"> SourceRace </a>
37
+ </li>
38
+ <li class="w-full border-b-2 border-neutral-100 py-4">
39
+ <a href="/source/source-sequence"> SourceSequence </a>
40
+ </li>
41
+ <li class="w-full border-b-2 border-neutral-100 py-4">
42
+ <a href="/source/source-with-pool"> SourceWithPool </a>
43
+ </li>
44
+ </ul>
45
+ </div>
46
+ </div>
47
+ <div
48
+ class="sm:w-2/3 sm:pl-8 sm:border-l border-gray-200 sm:border-t-0 border-t mt-4 sm:mt-0"
49
+ >
50
+ <div class="source-loader">
51
+ <div class="w-full flex justify-center">
52
+ <div
53
+ class="inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-current border-e-transparent align-[-0.125em] text-indigo-500 motion-reduce:animate-[spin_1.5s_linear_infinite]"
54
+ role="status"
55
+ >
56
+ <span
57
+ class="!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]"
58
+ >Loading...</span
59
+ >
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <div class="source-page-area"></div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </section>
@@ -0,0 +1,14 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Гость</h1>
2
+
3
+ <p class="text-gray-600 text-lg mb-4">
4
+ Гость - это посетитель, который является функцией или объектом без
5
+ introduction или объектом с методом introduction, который возвращает значение
6
+ 'guest'
7
+ </p>
8
+
9
+ <p class="text-gray-600 text-lg mb-4">
10
+ Гость получает значение от источника данных один раз. Но библиотека имеет
11
+ механики на случай если у источника данных нет данных на текущий момент, то
12
+ можно задать гостю значение при первом появлении данных. Для этих механик
13
+ смотрите: GuestPool, PatronOnce, SourceEmpty
14
+ </p>
@@ -0,0 +1,6 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Терминология</h1>
2
+
3
+ <p class="text-gray-600 text-lg mb-4">
4
+ Раздел посвящен терминам, которые требуют раскрытия и не могут(или не должны)
5
+ быть раскрыты в описаниях классов и функций библиотеки
6
+ </p>