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,72 @@
1
+ <section class="text-gray-600 body-font">
2
+ <div
3
+ class="container mx-auto flex px-5 py-24 items-center justify-center flex-col"
4
+ >
5
+ <div class="text-center lg:w-2/3 w-full mb-10">
6
+ <h1
7
+ class="title-font sm:text-4xl text-3xl mb-4 font-medium text-gray-600"
8
+ >
9
+ Patron: responsibility, respect, result
10
+ </h1>
11
+ <p class="mb-8 leading-relaxed">
12
+ Библиотека предназначена для того, чтобы дать пользователю возможность
13
+ сконцентрироваться на разработке внутренней надёжной логики класса.
14
+ Классы, использующие библиотеку, становятся ответственными за те
15
+ результаты которые представляют и уважительно относятся к объектам с
16
+ которыми взаимодействуют
17
+ </p>
18
+ </div>
19
+ <div class="lg:w-2/3 w-full mb-14">
20
+ <h1
21
+ class="text-center title-font sm:text-4xl text-3xl mb-4 font-medium text-gray-600"
22
+ >
23
+ Patron - это протокол для общения между объектами
24
+ </h1>
25
+ <p class="mb-8 leading-relaxed">
26
+ В программе использующей Patron библиотеку есть объекты совместимые с
27
+ SourceType - это источники данных, такие объекты могу отдавать
28
+ данные. Есть объекты совместимые с GuestType - это потребители данных,
29
+ они могут принять данные
30
+ </p>
31
+ <div class="mb-4">
32
+ <h3 class="pb-3 text-xl font-semibold text-gray-600">
33
+ Сценарий 1. Диалог
34
+ </h3>
35
+ <p>
36
+ Объект А - источник данных, объект B - потребитель. Если объекту B
37
+ нужны какие-то данные, то B обращается к А через метод A.value
38
+ запрашивая данные. Когда А посчитает нужным, то А вернет B значение,
39
+ вызывая B.give
40
+ </p>
41
+ </div>
42
+ <div class="mb-4">
43
+ <h3 class="pb-3 text-xl font-semibold text-gray-600">
44
+ Сценарий 2. Расширение
45
+ </h3>
46
+ <p class="mb-2">
47
+ Объект А - источник данных запрашивающий случайное слово в интернете,
48
+ объект B - источник изменяющий в базовом источнике первым символ на
49
+ верхний регистр. Объект C - источник добавляющий в конец значения из
50
+ базового источника знак восклицания "!". Объект D - потребитель
51
+ результата, выводящий значение на экран
52
+ </p>
53
+ <p>
54
+ Получаем следующую композицию с = new C(new B(new A)), далее выражение
55
+ c.value(new D()) - Выводит результат на экран
56
+ </p>
57
+ </div>
58
+
59
+ <div class="mb-4">
60
+ <h3 class="pb-3 text-xl font-semibold text-gray-600">
61
+ Сценарий 3. Постоянный потребитель
62
+ </h3>
63
+ <p class="mb-2">
64
+ Объект А - источник данных, объект B - потребитель данных. Объект B
65
+ может представиться как 'patron', благодаря этому, объект А в случае,
66
+ если у него появится новое значение, будет знать что B нужно
67
+ оповестить о новом значении
68
+ </p>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </section>
@@ -0,0 +1,5 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Angular</h1>
2
+
3
+ <p class="text-gray-600 text-lg mb-4">
4
+ Раздел в процессе наполнения.
5
+ </p>
@@ -0,0 +1,17 @@
1
+ <div class="integrations-menu"></div>
2
+ <div class="w-full sm:w-2/3 mt-4 sm:mt-0 mx-auto">
3
+ <div class="integrations-loader">
4
+ <div class="w-full flex justify-center">
5
+ <div
6
+ 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]"
7
+ role="status"
8
+ >
9
+ <span
10
+ class="!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]"
11
+ >Loading...</span
12
+ >
13
+ </div>
14
+ </div>
15
+ </div>
16
+ <div class="integrations-page-area"></div>
17
+ </div>
@@ -0,0 +1,7 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">
2
+ React
3
+ </h1>
4
+
5
+ <p class="text-gray-600 text-lg mb-4">
6
+ Раздел в процессе наполнения.
7
+ </p>
@@ -0,0 +1,102 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Vue</h1>
2
+
3
+ <p class="text-gray-600 text-lg mb-4">
4
+ Библиотека Patron интегрируется в Vue без каких-либо проблем. Например, чтобы
5
+ <span class="dynamic-navigation">
6
+ <a
7
+ 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"
8
+ href="/terminology/the-source"
9
+ >
10
+ источник данных
11
+ </a>
12
+ </span>
13
+ привязать к ref можно использовать такой класс (Листинг 1).
14
+ </p>
15
+
16
+ <p class="text-gray-600 text-lg mb-0 font-bold">Листинг 1.</p>
17
+ <pre
18
+ class="mb-4"
19
+ ><code class="language-js">class VueRefPatron&lt;T&gt; implements GuestType&lt;T&gt; {
20
+ private readonly innerRef: Ref&lt;T | undefined&gt;;
21
+
22
+ public constructor(defaultValue: T | undefined = undefined) {
23
+ this.innerRef = ref(defaultValue);
24
+ }
25
+
26
+ public ref() {
27
+ return this.innerRef;
28
+ }
29
+
30
+ public give(value: T) {
31
+ this.innerRef.value = value;
32
+ return this;
33
+ }
34
+
35
+ public introduction() {
36
+ return &#39;patron&#39; as const;
37
+ }
38
+ }
39
+ </code></pre>
40
+
41
+ <p class="text-gray-600 text-lg mb-4">
42
+ Класс VueRefPatron можно использовать как посетителя для разных источников
43
+ данных, связывая таким образом источники данных с системой реактивности Vue.
44
+ </p>
45
+
46
+ <h3 class="pb-3 text-xl font-semibold text-gray-600">
47
+ Источники в шаблоне Vue
48
+ </h3>
49
+
50
+ <p class="text-gray-600 text-lg mb-4">
51
+ Также в шаблонах можно использовать заготовку из листинга 2, для того, чтобы
52
+ концентрироваться на разработке чистых компонентов, ожидающих простые данные,
53
+ вместо того, чтобы смешивать логику получения данных и логику компонентов.
54
+ </p>
55
+
56
+ <p class="text-gray-600 text-lg mb-0 font-bold">Листинг 2.</p>
57
+ <pre class="mb-4"><code class="language-html">
58
+ &lt;template&gt;
59
+ &lt;div&gt;
60
+ &lt;slot v-if=&quot;!data&quot; name=&quot;fallback&quot; /&gt;
61
+ &lt;slot v-else :data=&quot;data&quot; /&gt;
62
+ &lt;/div&gt;
63
+ &lt;/template&gt;
64
+
65
+ &lt;script lang=&quot;ts&quot;&gt;
66
+ import { Source, Guest, Patron } from &#39;patron-oop&#39;;
67
+ import { defineComponent, ref } from &#39;vue&#39;;
68
+ import { PropType } from &#39;vue/types/v3-component-props&#39;;
69
+
70
+ export default defineComponent({
71
+ name: &#39;Source&#39;,
72
+ emits: [&#39;input&#39;],
73
+ props: {
74
+ source: {
75
+ type: Object as PropType&lt;Source&lt;any&gt;&gt;,
76
+ required: true,
77
+ },
78
+ },
79
+ setup(props, { emit }) {
80
+ const data = ref(null);
81
+ props.source.value(
82
+ new Patron(
83
+ new Guest(value =&gt; {
84
+ data.value = value;
85
+ emit(&#39;input&#39;, value);
86
+ })
87
+ )
88
+ );
89
+ return {
90
+ data,
91
+ };
92
+ },
93
+ });
94
+ &lt;/script&gt;
95
+
96
+ </code></pre>
97
+
98
+ <p class="text-gray-600 text-lg mb-4">
99
+ В результате компонент Source можно использовать, чтобы оборачивать другие
100
+ компоненты, требующие данные, передать в компонент источник данных, результат
101
+ работы которого будет в пропсе data в слоте default.
102
+ </p>
@@ -0,0 +1,140 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс Patron</h1>
2
+
3
+ <a href="https://github.com/kosukhin/patron/blob/main/src/Patron/Patron.ts" target="_blank"
4
+ 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">
5
+ <img src="./assets/img/github_16.jpg" width="16" height="16" />
6
+ Patron на GitHub
7
+ </a>
8
+
9
+ <p class="text-gray-600 text-lg mb-4">
10
+ Предназначен для динамического превращения
11
+ <span class="dynamic-navigation">
12
+ <a 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"
13
+ href="/terminology/the-guest">
14
+ гостя
15
+ </a>
16
+ </span>
17
+ в
18
+ <span class="dynamic-navigation">
19
+ <a 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"
20
+ href="/terminology/the-patron">
21
+ патрона
22
+ </a>
23
+ </span>
24
+ </p>
25
+
26
+ <p class="text-gray-600 text-lg mb-4">
27
+ Это поведение полезно в случаях, когда нужно из просто посетителя(гостя)
28
+ сделать постоянного посетиеля(патрона). Это будет означать что если у
29
+ <span class="dynamic-navigation">
30
+ <a 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"
31
+ href="/terminology/the-source">
32
+ источника данных
33
+ </a>
34
+ </span>
35
+ есть новые данные, то источник отдаст эту новую порцию данных всем своим
36
+ постоянным посетителям(патронам)
37
+ </p>
38
+
39
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
40
+ <pre class="mb-4"><code class="language-js">import {
41
+ Patron,
42
+ SourceWithPool,
43
+ Source,
44
+ GuestDisposable,
45
+ isPatronInPools,
46
+ } from "patron-oop";
47
+
48
+ const source = new SourceWithPool(1);
49
+ const timer = new Source((guest) => {
50
+ source.value(guest);
51
+ const repeat = () => {
52
+ if (!isPatronInPools(guest)) {
53
+ return;
54
+ }
55
+ source.value((value) => {
56
+ setTimeout(() => {
57
+ source.give(value + 1);
58
+ repeat();
59
+ }, 1000);
60
+ });
61
+ };
62
+ repeat();
63
+ });
64
+
65
+ timer.value(
66
+ new Patron(
67
+ new GuestDisposable(
68
+ (value) => {
69
+ const el = document.querySelector(".patron-result");
70
+ if (el) {
71
+ el.textContent = `Секунд прошло ${value}`;
72
+ }
73
+ },
74
+ () => {
75
+ return !document.querySelector(".patron-result");
76
+ }
77
+ )
78
+ )
79
+ );
80
+ </code></pre>
81
+
82
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
83
+ <div class="example mb-4">
84
+ <span class="patron-result">Result here</span>
85
+ </div>
86
+ <script type="module">
87
+ import {
88
+ Patron,
89
+ SourceWithPool,
90
+ Source,
91
+ GuestDisposable,
92
+ isPatronInPools,
93
+ } from "patron-oop";
94
+
95
+ const source = new SourceWithPool(1);
96
+ const timer = new Source((guest) => {
97
+ source.value(guest);
98
+ const repeat = () => {
99
+ if (!isPatronInPools(guest)) {
100
+ return;
101
+ }
102
+ source.value((value) => {
103
+ setTimeout(() => {
104
+ source.give(value + 1);
105
+ repeat();
106
+ }, 1000);
107
+ });
108
+ };
109
+ repeat();
110
+ });
111
+
112
+ timer.value(
113
+ new Patron(
114
+ new GuestDisposable(
115
+ (value) => {
116
+ const el = document.querySelector(".patron-result");
117
+ if (el) {
118
+ el.textContent = `Секунд прошло ${value}`;
119
+ }
120
+ },
121
+ () => {
122
+ return !document.querySelector(".patron-result");
123
+ }
124
+ )
125
+ )
126
+ );
127
+ </script>
128
+
129
+ <div class="font-bold mt-8">Смотрите также</div>
130
+
131
+ <p class="text-gray-600 text-lg mb-4 dynamic-navigation">
132
+ <a 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"
133
+ href="/source">Source</a>
134
+ <a 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"
135
+ href="/guest/guest-disposable">GuestDisposable</a>
136
+ <a 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"
137
+ href="/source/source-with-pool">SourceWithPool</a>
138
+ <a 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"
139
+ href="/utils/is-patron-in-pools">isPatronInPools</a>
140
+ </p>
@@ -0,0 +1,66 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс PatronApplied</h1>
2
+
3
+ <a href="https://github.com/kosukhin/patron/blob/main/src/Patron/PatronApplied.ts" target="_blank"
4
+ 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">
5
+ <img src="./assets/img/github_16.jpg" width="16" height="16" />
6
+ PatronApplied на GitHub
7
+ </a>
8
+
9
+ <p class="text-gray-600 text-lg mb-4">
10
+ Класс PatronApplied под капотом использует GuestApplied, только является патроном.
11
+ </p>
12
+
13
+
14
+ <p class="text-gray-600 text-lg mb-4">
15
+ Полезен когда мы работаем с источниками данных обладающими пулом патронов, которые могут присылать новые значения.
16
+ </p>
17
+
18
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
19
+ <pre
20
+ class="mb-4"
21
+ ><code class="language-js">import { Guest, PatronApplied, SourceWithPool } from "patron-oop";
22
+
23
+ window.source = new SourceWithPool(20);
24
+
25
+ const guest = new Guest((value) => {
26
+ document.querySelector(
27
+ ".guest-result"
28
+ ).textContent = `Double value is ${value}`;
29
+ });
30
+
31
+ window.source.value(
32
+ new PatronApplied(guest, (x) => x * 2)
33
+ );
34
+ </code></pre>
35
+
36
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
37
+ <div class="example mb-4">
38
+ <span class="guest-result">Result here</span>
39
+ </div>
40
+ <button
41
+ 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"
42
+ onclick="source.give(40)"
43
+ >
44
+ Дать источнику значение 40
45
+ </button>
46
+ <button
47
+ 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"
48
+ onclick="source.give(25)"
49
+ >
50
+ Дать источнику значение 25
51
+ </button>
52
+ <script type="module">
53
+ import { Guest, PatronApplied, SourceWithPool } from "patron-oop";
54
+
55
+ window.source = new SourceWithPool(20);
56
+
57
+ const guest = new Guest((value) => {
58
+ document.querySelector(
59
+ ".guest-result"
60
+ ).textContent = `Double value is ${value}`;
61
+ });
62
+
63
+ window.source.value(
64
+ new PatronApplied(guest, (x) => x * 2)
65
+ );
66
+ </script>
@@ -0,0 +1,94 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс PatronExecutorApplied</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Patron/PatronExecutorApplied.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
+ PatronExecutorApplied на GitHub
14
+ </a>
15
+
16
+ <p class="text-gray-600 text-lg mb-4">
17
+ Класс PatronExecutorApplied под капотом использует GuestExecutorApplied, только является патроном.
18
+ </p>
19
+
20
+ <p class="text-gray-600 text-lg mb-4">
21
+ Полезен когда мы работаем с источниками данных обладающими пулом патронов, которые могут присылать новые значения.
22
+ </p>
23
+
24
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
25
+ <pre
26
+ class="mb-4"
27
+ ><code class="language-js">import { Guest, PatronExecutorApplied, Patron, SourceWithPool } from "patron-oop";
28
+
29
+ window.source = new SourceWithPool(20);
30
+
31
+ const loadingSource = new SourceWithPool('');
32
+
33
+ const guest = new Guest((value) => {
34
+ document.querySelector(
35
+ ".guest-result"
36
+ ).textContent = `value is ${value}`;
37
+ });
38
+
39
+ loadingSource.value(new Patron(guest));
40
+
41
+ window.source.value(
42
+ new PatronExecutorApplied(guest, (guestFn) => {
43
+ return v => {
44
+ loadingSource.give('Загрузка...');
45
+ setTimeout(() => {
46
+ guestFn(v);
47
+ }, 5000)
48
+ }
49
+ })
50
+ );
51
+ </code></pre>
52
+
53
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
54
+ <div class="example mb-4">
55
+ <span class="guest-result">Результат через 5 сек...</span>
56
+ </div>
57
+ <button
58
+ 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"
59
+ onclick="source.give(40)"
60
+ >
61
+ Дать источнику значение 40
62
+ </button>
63
+ <button
64
+ 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"
65
+ onclick="source.give(25)"
66
+ >
67
+ Дать источнику значение 25
68
+ </button>
69
+ <script type="module">
70
+ import { Guest, PatronExecutorApplied, Patron, SourceWithPool } from "patron-oop";
71
+
72
+ window.source = new SourceWithPool(20);
73
+
74
+ const loadingSource = new SourceWithPool('');
75
+
76
+ const guest = new Guest((value) => {
77
+ document.querySelector(
78
+ ".guest-result"
79
+ ).textContent = `value is ${value}`;
80
+ });
81
+
82
+ loadingSource.value(new Patron(guest));
83
+
84
+ window.source.value(
85
+ new PatronExecutorApplied(guest, (guestFn) => {
86
+ return v => {
87
+ loadingSource.give('Загрузка...');
88
+ setTimeout(() => {
89
+ guestFn(v);
90
+ }, 5000)
91
+ }
92
+ })
93
+ );
94
+ </script>
@@ -0,0 +1,110 @@
1
+ <h1 class="pb-3 text-xl font-semibold text-gray-600">Класс PatronOnce</h1>
2
+
3
+ <a
4
+ href="https://github.com/kosukhin/patron/blob/main/src/Patron/PatronOnce.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
+ PatronOnce на 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-patron"
22
+ >
23
+ патрона
24
+ </a>
25
+ </span>
26
+ , который будет выполнен только один раз и удалит себя после получения первого
27
+ значения
28
+ </p>
29
+
30
+ <p class="text-gray-600 text-lg mb-4">
31
+ Такое поведение полезно, когда нужно получить значение, которое возможно еще
32
+ не установлено в
33
+ <span class="dynamic-navigation">
34
+ <a
35
+ 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"
36
+ href="/terminology/the-source"
37
+ >
38
+ источнике данных
39
+ </a>
40
+ </span>
41
+ </p>
42
+
43
+ <p class="text-gray-600 text-lg mb-4">
44
+ Схожий результат можно получить при использовании классов GuestDisposable или
45
+ GuestPool или SourceEmpty
46
+ </p>
47
+
48
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
49
+ <pre class="mb-4"><code class="language-js">import { SourceWithPool, PatronOnce } from "patron-oop";
50
+
51
+ const source = new SourceWithPool("один раз");
52
+ source.value(
53
+ new PatronOnce((value) => {
54
+ document.querySelector(
55
+ ".patron-once-result"
56
+ ).textContent = `Результат ${value}`;
57
+ })
58
+ );
59
+
60
+ setTimeout(() => {
61
+ source.give("два раза");
62
+ });
63
+ setTimeout(() => {
64
+ source.give("три раза");
65
+ });
66
+ </code></pre>
67
+
68
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
69
+ <div class="example mb-4">
70
+ <span class="patron-once-result">Нет результата!</span>
71
+ </div>
72
+ <script type="module">
73
+ import { SourceWithPool, PatronOnce } from "patron-oop";
74
+
75
+ const source = new SourceWithPool("один раз");
76
+ source.value(
77
+ new PatronOnce((value) => {
78
+ document.querySelector(
79
+ ".patron-once-result"
80
+ ).textContent = `Результат ${value}`;
81
+ })
82
+ );
83
+
84
+ setTimeout(() => {
85
+ source.give("два раза");
86
+ });
87
+ setTimeout(() => {
88
+ source.give("три раза");
89
+ });
90
+ </script>
91
+
92
+ <div class="font-bold mt-8">Смотрите также</div>
93
+
94
+ <p class="text-gray-600 text-lg mb-4 dynamic-navigation">
95
+ <a
96
+ 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"
97
+ href="/guest/guest-pool"
98
+ >GuestPool</a
99
+ >
100
+ <a
101
+ 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"
102
+ href="/guest/guest-disposable"
103
+ >GuestDisposable</a
104
+ >
105
+ <a
106
+ 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"
107
+ href="/source"
108
+ >Source</a
109
+ >
110
+ </p>