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,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>
|