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.
- package/CHANGELOG.md +12 -0
- package/dist/patron.cjs +106 -35
- package/dist/patron.cjs.map +1 -1
- package/dist/patron.d.ts +40 -1
- package/dist/patron.js +103 -36
- package/dist/patron.js.map +1 -1
- package/dist/patron.min.js +1 -1
- package/dist/patron.min.mjs +1 -1
- package/dist/patron.min.mjs.map +1 -1
- package/dist/patron.mjs +103 -36
- package/dist/patron.mjs.map +1 -1
- package/docs/README.md +3 -0
- package/docs/assets/css/base.css +42 -0
- package/docs/assets/favicon/android-icon-144x144.png +0 -0
- package/docs/assets/favicon/android-icon-192x192.png +0 -0
- package/docs/assets/favicon/android-icon-36x36.png +0 -0
- package/docs/assets/favicon/android-icon-48x48.png +0 -0
- package/docs/assets/favicon/android-icon-72x72.png +0 -0
- package/docs/assets/favicon/android-icon-96x96.png +0 -0
- package/docs/assets/favicon/apple-icon-114x114.png +0 -0
- package/docs/assets/favicon/apple-icon-120x120.png +0 -0
- package/docs/assets/favicon/apple-icon-144x144.png +0 -0
- package/docs/assets/favicon/apple-icon-152x152.png +0 -0
- package/docs/assets/favicon/apple-icon-180x180.png +0 -0
- package/docs/assets/favicon/apple-icon-57x57.png +0 -0
- package/docs/assets/favicon/apple-icon-60x60.png +0 -0
- package/docs/assets/favicon/apple-icon-72x72.png +0 -0
- package/docs/assets/favicon/apple-icon-76x76.png +0 -0
- package/docs/assets/favicon/apple-icon-precomposed.png +0 -0
- package/docs/assets/favicon/apple-icon.png +0 -0
- package/docs/assets/favicon/browserconfig.xml +2 -0
- package/docs/assets/favicon/favicon-16x16.png +0 -0
- package/docs/assets/favicon/favicon-32x32.png +0 -0
- package/docs/assets/favicon/favicon-96x96.png +0 -0
- package/docs/assets/favicon/favicon.ico +0 -0
- package/docs/assets/favicon/manifest.json +41 -0
- package/docs/assets/favicon/ms-icon-144x144.png +0 -0
- package/docs/assets/favicon/ms-icon-150x150.png +0 -0
- package/docs/assets/favicon/ms-icon-310x310.png +0 -0
- package/docs/assets/favicon/ms-icon-70x70.png +0 -0
- package/docs/assets/img/404.jpg +0 -0
- package/docs/assets/img/angular_16.jpg +0 -0
- package/docs/assets/img/angular_32.jpg +0 -0
- package/docs/assets/img/eo_16.jpg +0 -0
- package/docs/assets/img/eo_big.png +0 -0
- package/docs/assets/img/github_16.jpg +0 -0
- package/docs/assets/img/logo.jpg +0 -0
- package/docs/assets/img/philosofy/observable.jpg +0 -0
- package/docs/assets/img/philosofy/responsible.jpg +0 -0
- package/docs/assets/img/philosofy/result.jpg +0 -0
- package/docs/assets/img/philosofy/tell.jpg +0 -0
- package/docs/assets/img/react_16.jpg +0 -0
- package/docs/assets/img/react_32.jpg +0 -0
- package/docs/assets/img/vue_16.jpg +0 -0
- package/docs/assets/img/vue_32.jpg +0 -0
- package/docs/assets/js/components/linkDynamic.mjs +11 -0
- package/docs/assets/js/components/linkReloadable.mjs +13 -0
- package/docs/assets/js/entrypoints/compatibility.mjs +31 -0
- package/docs/assets/js/entrypoints/components.mjs +2 -0
- package/docs/assets/js/entrypoints/examples.mjs +25 -0
- package/docs/assets/js/entrypoints/factory.mjs +20 -0
- package/docs/assets/js/entrypoints/guest.mjs +61 -0
- package/docs/assets/js/entrypoints/index.mjs +110 -0
- package/docs/assets/js/entrypoints/integrations.mjs +36 -0
- package/docs/assets/js/entrypoints/patron.mjs +46 -0
- package/docs/assets/js/entrypoints/source.mjs +76 -0
- package/docs/assets/js/entrypoints/terminology.mjs +51 -0
- package/docs/assets/js/entrypoints/utils.mjs +61 -0
- package/docs/assets/js/lib/StyleFetched.mjs +14 -0
- package/docs/assets/js/routing.mjs +110 -0
- package/docs/assets/schemes/dip.html +28 -0
- package/docs/favicon.ico +0 -0
- package/docs/index-dev.html +346 -0
- package/docs/index.html +346 -0
- package/docs/manifest.json +41 -0
- package/docs/pages/404.html +9 -0
- package/docs/pages/common/layout.html +17 -0
- package/docs/pages/compatibility/dip.html +82 -0
- package/docs/pages/compatibility/elegant-objects.html +373 -0
- package/docs/pages/compatibility/layout.html +17 -0
- package/docs/pages/examples/errors.html +167 -0
- package/docs/pages/examples/index.html +10 -0
- package/docs/pages/examples.html +41 -0
- package/docs/pages/factory/index.html +18 -0
- package/docs/pages/factory.html +36 -0
- package/docs/pages/guest/guest-applied.html +51 -0
- package/docs/pages/guest/guest-cast.html +219 -0
- package/docs/pages/guest/guest-disposable.html +147 -0
- package/docs/pages/guest/guest-executor-applied.html +65 -0
- package/docs/pages/guest/guest-object.html +101 -0
- package/docs/pages/guest/guest-pool.html +107 -0
- package/docs/pages/guest/guest-sync.html +66 -0
- package/docs/pages/guest/index.html +115 -0
- package/docs/pages/guest.html +59 -0
- package/docs/pages/index.html +72 -0
- package/docs/pages/integrations/angular.html +5 -0
- package/docs/pages/integrations/layout.html +17 -0
- package/docs/pages/integrations/react.html +7 -0
- package/docs/pages/integrations/vue.html +102 -0
- package/docs/pages/patron/index.html +140 -0
- package/docs/pages/patron/patron-applied.html +66 -0
- package/docs/pages/patron/patron-executor-applied.html +94 -0
- package/docs/pages/patron/patron-once.html +110 -0
- package/docs/pages/patron/patron-pool.html +99 -0
- package/docs/pages/patron.html +50 -0
- package/docs/pages/philosofy.html +210 -0
- package/docs/pages/source/index.html +167 -0
- package/docs/pages/source/source-active.html +113 -0
- package/docs/pages/source/source-all.html +129 -0
- package/docs/pages/source/source-applied.html +73 -0
- package/docs/pages/source/source-dynamic.html +93 -0
- package/docs/pages/source/source-executor-applied.html +64 -0
- package/docs/pages/source/source-map.html +192 -0
- package/docs/pages/source/source-once.html +73 -0
- package/docs/pages/source/source-race.html +171 -0
- package/docs/pages/source/source-sequence.html +160 -0
- package/docs/pages/source/source-with-pool.html +102 -0
- package/docs/pages/source/source.html +167 -0
- package/docs/pages/source.html +68 -0
- package/docs/pages/terminology/guest.html +14 -0
- package/docs/pages/terminology/index.html +6 -0
- package/docs/pages/terminology/introduction.html +25 -0
- package/docs/pages/terminology/patron.html +10 -0
- package/docs/pages/terminology/source.html +55 -0
- package/docs/pages/terminology/visitor.html +19 -0
- package/docs/pages/terminology.html +53 -0
- package/docs/pages/utils/give.html +47 -0
- package/docs/pages/utils/index.html +24 -0
- package/docs/pages/utils/is-guest-aware.html +22 -0
- package/docs/pages/utils/is-guest.html +21 -0
- package/docs/pages/utils/is-patron-in-pools.html +53 -0
- package/docs/pages/utils/private.html +44 -0
- package/docs/pages/utils/remove-patron-from-pools.html +57 -0
- package/docs/pages/utils/value.html +47 -0
- package/docs/pages/utils.html +61 -0
- package/eslint.config.mjs +6 -0
- package/package.json +1 -1
- package/src/Patron/PatronApplied.ts +22 -0
- package/src/Patron/PatronExecutorApplied.ts +25 -0
- 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> </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
|
+
Предназначен для представления данных в виде <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>
|