silentium-components 0.0.70 → 0.0.71

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 (88) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/silentium-components.cjs +491 -436
  3. package/dist/silentium-components.cjs.map +1 -1
  4. package/dist/silentium-components.d.ts +42 -36
  5. package/dist/silentium-components.js +493 -438
  6. package/dist/silentium-components.js.map +1 -1
  7. package/dist/silentium-components.min.js +1 -1
  8. package/dist/silentium-components.min.mjs +1 -1
  9. package/dist/silentium-components.min.mjs.map +1 -1
  10. package/dist/silentium-components.mjs +493 -438
  11. package/dist/silentium-components.mjs.map +1 -1
  12. package/package.json +2 -2
  13. package/src/behaviors/Branch._main.test.ts +3 -3
  14. package/src/behaviors/Branch.branchesDontAffectResult.test.ts +4 -4
  15. package/src/behaviors/Branch.dontRespondAfterRespond.test.ts +6 -6
  16. package/src/behaviors/Branch.ts +23 -24
  17. package/src/behaviors/BranchLazy._main.test.ts +5 -5
  18. package/src/behaviors/BranchLazy.ts +31 -23
  19. package/src/behaviors/Const.test.ts +10 -8
  20. package/src/behaviors/Const.ts +9 -10
  21. package/src/behaviors/Deadline._main.test.ts +4 -4
  22. package/src/behaviors/Deadline._value.test.ts +5 -5
  23. package/src/behaviors/Deadline.ts +37 -28
  24. package/src/behaviors/Deferred.test.ts +10 -10
  25. package/src/behaviors/Deferred.ts +14 -12
  26. package/src/behaviors/Detached.test.ts +4 -4
  27. package/src/behaviors/Detached.ts +6 -6
  28. package/src/behaviors/Dirty.test.ts +3 -3
  29. package/src/behaviors/Dirty.ts +46 -26
  30. package/src/behaviors/Loading.test.ts +7 -10
  31. package/src/behaviors/Loading.ts +9 -9
  32. package/src/behaviors/Lock.test.ts +3 -3
  33. package/src/behaviors/Lock.ts +12 -10
  34. package/src/behaviors/Memo.test.ts +8 -6
  35. package/src/behaviors/Memo.ts +13 -12
  36. package/src/behaviors/OnlyChanged.test.ts +4 -4
  37. package/src/behaviors/OnlyChanged.ts +14 -13
  38. package/src/behaviors/Part.test.ts +6 -6
  39. package/src/behaviors/Part.ts +53 -30
  40. package/src/behaviors/Path._main.test.ts +2 -2
  41. package/src/behaviors/Path.index.test.ts +2 -2
  42. package/src/behaviors/Path.nested.test.ts +2 -2
  43. package/src/behaviors/Path.ts +20 -21
  44. package/src/behaviors/Polling.test.ts +10 -10
  45. package/src/behaviors/Polling.ts +10 -8
  46. package/src/behaviors/Shot._main.test.ts +10 -10
  47. package/src/behaviors/Shot._onlyChanged.test.ts +13 -11
  48. package/src/behaviors/Shot.ts +15 -12
  49. package/src/behaviors/Task.ts +4 -4
  50. package/src/behaviors/Tick.test.ts +7 -7
  51. package/src/behaviors/Tick.ts +13 -11
  52. package/src/behaviors/Transaction.test.ts +3 -3
  53. package/src/behaviors/Transaction.ts +13 -12
  54. package/src/boolean/And.test.ts +11 -11
  55. package/src/boolean/And.ts +10 -11
  56. package/src/boolean/Bool.test.ts +2 -2
  57. package/src/boolean/Bool.ts +5 -5
  58. package/src/boolean/Not.test.ts +3 -3
  59. package/src/boolean/Not.ts +9 -7
  60. package/src/boolean/Or.test.ts +3 -3
  61. package/src/boolean/Or.ts +10 -11
  62. package/src/formats/FromJson.ts +14 -12
  63. package/src/formats/ToJson.ts +14 -12
  64. package/src/lists/First.test.ts +2 -2
  65. package/src/lists/First.ts +5 -5
  66. package/src/navigation/Router._main.test.ts +20 -13
  67. package/src/navigation/Router._nested.test.ts +41 -33
  68. package/src/navigation/Router.ts +48 -50
  69. package/src/strings/Concatenated.test.ts +3 -3
  70. package/src/strings/Concatenated.ts +8 -9
  71. package/src/strings/Template._main.test.ts +3 -3
  72. package/src/strings/Template._place.test.ts +2 -2
  73. package/src/strings/Template.ts +54 -40
  74. package/src/structures/HashTable.test.ts +6 -6
  75. package/src/structures/HashTable.ts +10 -8
  76. package/src/structures/Record._main.test.ts +6 -6
  77. package/src/structures/Record.concatenated.test.ts +12 -10
  78. package/src/structures/Record.nested.test.ts +5 -5
  79. package/src/structures/RecordOf.ts +14 -12
  80. package/src/system/RegexpMatch._group.test.ts +4 -4
  81. package/src/system/RegexpMatch._main.test.ts +4 -4
  82. package/src/system/RegexpMatch.ts +9 -11
  83. package/src/system/RegexpMatched.test.ts +5 -5
  84. package/src/system/RegexpMatched.ts +8 -10
  85. package/src/system/RegexpReplaced.test.ts +5 -5
  86. package/src/system/RegexpReplaced.ts +10 -11
  87. package/src/system/Set.test.ts +5 -5
  88. package/src/system/Set.ts +9 -11
@@ -1,253 +1,299 @@
1
- import { Primitive, Shared, Filtered, isFilled, Late, Applied, All, ExecutorApplied, LateShared, Destructor, Of } from 'silentium';
2
-
3
- function Branch(conditionSrc, leftSrc, rightSrc) {
4
- return (user) => {
5
- const leftSync = Primitive(leftSrc);
6
- let rightSync;
7
- if (rightSrc !== void 0) {
8
- rightSync = Primitive(rightSrc);
1
+ import { Event, Primitive, Transport, Shared, Filtered, isFilled, Late, Applied, All, SharedSource, ExecutorApplied, LateShared, Of, DestroyContainer, isDestroyable, TransportEvent, TransportDestroyable } from 'silentium';
2
+
3
+ function Branch($condition, $left, $right) {
4
+ return Event((transport) => {
5
+ const left = Primitive($left);
6
+ let right;
7
+ if ($right !== void 0) {
8
+ right = Primitive($right);
9
9
  }
10
- conditionSrc((v) => {
11
- let result = null;
12
- if (v) {
13
- result = leftSync.primitive();
14
- } else if (rightSync) {
15
- result = rightSync.primitive();
16
- }
17
- if (result !== null) {
18
- user(result);
19
- }
20
- });
21
- };
22
- }
23
-
24
- function BranchLazy(conditionSrc, leftSrc, rightSrc) {
25
- return (user) => {
26
- let Destructor;
27
- conditionSrc((v) => {
28
- if (Destructor !== void 0 && typeof Destructor === "function") {
29
- Destructor();
30
- }
31
- let instance = null;
32
- if (v) {
33
- instance = leftSrc();
34
- } else if (rightSrc) {
35
- instance = rightSrc();
36
- }
37
- if (instance) {
38
- Destructor = instance(user);
39
- }
40
- });
10
+ $condition.event(
11
+ Transport((v) => {
12
+ let result = null;
13
+ if (v) {
14
+ result = left.primitive();
15
+ } else if (right) {
16
+ result = right.primitive();
17
+ }
18
+ if (result !== null) {
19
+ transport.use(result);
20
+ }
21
+ })
22
+ );
23
+ });
24
+ }
25
+
26
+ function BranchLazy($condition, $left, $right) {
27
+ return Event((transport) => {
28
+ let destructor;
29
+ $condition.event(
30
+ Transport((v) => {
31
+ if (destructor !== void 0 && typeof destructor === "function") {
32
+ destructor();
33
+ }
34
+ let instance = null;
35
+ if (v) {
36
+ instance = $left.use();
37
+ } else if ($right) {
38
+ instance = $right.use();
39
+ }
40
+ if (instance) {
41
+ instance.event(transport);
42
+ destructor = instance.destroy;
43
+ }
44
+ })
45
+ );
41
46
  return () => {
42
- Destructor?.();
47
+ destructor?.();
43
48
  };
44
- };
45
- }
46
-
47
- function Constant(permanentValue, triggerSrc) {
48
- return (user) => {
49
- triggerSrc(() => {
50
- user(permanentValue);
51
- });
52
- };
53
- }
54
-
55
- function Deadline(error, baseSrc, timeoutSrc) {
56
- return (user) => {
57
- let timerHead = null;
58
- const s = Shared(baseSrc, true);
59
- timeoutSrc((timeout) => {
60
- if (timerHead) {
61
- clearTimeout(timerHead);
62
- }
63
- let timeoutReached = false;
64
- timerHead = setTimeout(() => {
65
- if (timeoutReached) {
66
- return;
49
+ });
50
+ }
51
+
52
+ function Constant(permanent, $trigger) {
53
+ return Event((transport) => {
54
+ $trigger.event(
55
+ Transport(() => {
56
+ transport.use(permanent);
57
+ })
58
+ );
59
+ });
60
+ }
61
+
62
+ function Deadline(error, $base, $timeout) {
63
+ return Event((transport) => {
64
+ let timer = null;
65
+ const base = Shared($base, true);
66
+ $timeout.event(
67
+ Transport((timeout) => {
68
+ if (timer) {
69
+ clearTimeout(timer);
67
70
  }
68
- timeoutReached = true;
69
- error(new Error("Timeout reached in Deadline class"));
70
- }, timeout);
71
- const f = Filtered(s.event, () => !timeoutReached);
72
- f(user);
73
- s.event(() => {
74
- timeoutReached = true;
75
- });
76
- });
77
- };
78
- }
79
-
80
- function Deferred(baseSrc, triggerSrc) {
81
- return (user) => {
82
- const baseSync = Primitive(baseSrc);
83
- triggerSrc(() => {
84
- const value = baseSync.primitive();
85
- if (isFilled(value)) {
86
- user(value);
87
- }
88
- });
89
- };
71
+ let timeoutReached = false;
72
+ timer = setTimeout(() => {
73
+ if (timeoutReached) {
74
+ return;
75
+ }
76
+ timeoutReached = true;
77
+ error.use(new Error("Timeout reached in Deadline class"));
78
+ }, timeout);
79
+ const f = Filtered(base, () => !timeoutReached);
80
+ f.event(transport);
81
+ base.event(
82
+ Transport(() => {
83
+ timeoutReached = true;
84
+ })
85
+ );
86
+ })
87
+ );
88
+ });
89
+ }
90
+
91
+ function Deferred($base, $trigger) {
92
+ return Event((transport) => {
93
+ const base = Primitive($base);
94
+ $trigger.event(
95
+ Transport(() => {
96
+ const value = base.primitive();
97
+ if (isFilled(value)) {
98
+ transport.use(value);
99
+ }
100
+ })
101
+ );
102
+ });
90
103
  }
91
104
 
92
- function Detached(baseSrc) {
93
- return function Detached2(user) {
94
- const v = Primitive(baseSrc).primitive();
105
+ function Detached($base) {
106
+ return Event((transport) => {
107
+ const v = Primitive($base).primitive();
95
108
  if (isFilled(v)) {
96
- user(v);
109
+ transport.use(v);
110
+ }
111
+ });
112
+ }
113
+
114
+ var __defProp$2 = Object.defineProperty;
115
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
116
+ var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
117
+ function Dirty($base, keep = [], exclude = [], cloner) {
118
+ return new DirtySource($base, keep, exclude, cloner);
119
+ }
120
+ class DirtySource {
121
+ constructor($base, keep = [], exclude = [], cloner) {
122
+ this.$base = $base;
123
+ this.keep = keep;
124
+ this.exclude = exclude;
125
+ __publicField$2(this, "$comparing", Late());
126
+ __publicField$2(this, "cloner");
127
+ if (cloner === void 0) {
128
+ this.cloner = (value) => JSON.parse(JSON.stringify(value));
129
+ } else {
130
+ this.cloner = cloner;
97
131
  }
98
- };
99
- }
100
-
101
- function Dirty(baseEntitySource, alwaysKeep = [], excludeKeys = [], cloneFn) {
102
- const comparingSrc = Late();
103
- if (cloneFn === void 0) {
104
- cloneFn = (value) => JSON.parse(JSON.stringify(value));
105
132
  }
106
- return {
107
- event: (user) => {
108
- const comparingDetached = Applied(comparingSrc.event, cloneFn);
109
- All(
110
- comparingDetached,
111
- baseEntitySource
112
- )(([comparing, base]) => {
133
+ event(transport) {
134
+ const $comparing = Applied(this.$comparing, this.cloner);
135
+ All($comparing, this.$base).event(
136
+ Transport(([comparing, base]) => {
113
137
  if (!comparing) {
114
138
  return;
115
139
  }
116
- user(
140
+ transport.use(
117
141
  Object.fromEntries(
118
142
  Object.entries(comparing).filter(([key, value]) => {
119
- if (alwaysKeep.includes(key)) {
143
+ if (this.keep.includes(key)) {
120
144
  return true;
121
145
  }
122
- if (excludeKeys.includes(key)) {
146
+ if (this.exclude.includes(key)) {
123
147
  return false;
124
148
  }
125
149
  return value !== base[key];
126
150
  })
127
151
  )
128
152
  );
129
- });
130
- },
131
- use: (v) => {
132
- comparingSrc.use(v);
133
- }
134
- };
153
+ })
154
+ );
155
+ return this;
156
+ }
157
+ use(v) {
158
+ this.$comparing.use(v);
159
+ return this;
160
+ }
135
161
  }
136
162
 
137
- function Loading(loadingStartSrc, loadingFinishSrc) {
138
- return (user) => {
139
- loadingStartSrc(() => user(true));
140
- loadingFinishSrc(() => user(false));
141
- };
163
+ function Loading($loadingStart, $loadingFinish) {
164
+ return Event((transport) => {
165
+ $loadingStart.event(Transport(() => transport.use(true)));
166
+ $loadingFinish.event(Transport(() => transport.use(false)));
167
+ });
142
168
  }
143
169
 
144
- function Lock(baseSrc, lockSrc) {
145
- return (user) => {
170
+ function Lock($base, $lock) {
171
+ return Event((transport) => {
146
172
  let locked = false;
147
- lockSrc((newLock) => {
148
- locked = newLock;
149
- });
150
- const i = Filtered(baseSrc, () => !locked);
151
- i(user);
152
- };
153
- }
154
-
155
- function Memo(baseSrc) {
156
- return (user) => {
157
- let lastValue = null;
158
- baseSrc((v) => {
159
- if (v !== lastValue) {
160
- user(v);
161
- lastValue = v;
162
- }
163
- });
164
- };
165
- }
166
-
167
- function OnlyChanged(baseSrc) {
168
- return (user) => {
169
- let firstValue = false;
170
- baseSrc((v) => {
171
- if (firstValue === false) {
172
- firstValue = true;
173
- } else {
174
- user(v);
175
- }
176
- });
177
- };
178
- }
179
-
180
- function Part(baseSrc, keySrc) {
181
- const baseSync = Primitive(baseSrc.event);
182
- const keySync = Primitive(keySrc);
183
- return {
184
- event: (user) => {
185
- All(
186
- baseSrc.event,
187
- keySrc
188
- )(([base, key]) => {
189
- const keyChunks = key.split(".");
173
+ $lock.event(
174
+ Transport((newLock) => {
175
+ locked = newLock;
176
+ })
177
+ );
178
+ const i = Filtered($base, () => !locked);
179
+ i.event(transport);
180
+ });
181
+ }
182
+
183
+ function Memo($base) {
184
+ return Event((transport) => {
185
+ let last = null;
186
+ $base.event(
187
+ Transport((v) => {
188
+ if (v !== last) {
189
+ transport.use(v);
190
+ last = v;
191
+ }
192
+ })
193
+ );
194
+ });
195
+ }
196
+
197
+ function OnlyChanged($base) {
198
+ return Event((transport) => {
199
+ let first = false;
200
+ $base.event(
201
+ Transport((v) => {
202
+ if (first === false) {
203
+ first = true;
204
+ } else {
205
+ transport.use(v);
206
+ }
207
+ })
208
+ );
209
+ });
210
+ }
211
+
212
+ var __defProp$1 = Object.defineProperty;
213
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
214
+ var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
215
+ function Part($base, $key) {
216
+ return new PartEvent($base, $key);
217
+ }
218
+ class PartEvent {
219
+ constructor($base, $key) {
220
+ __publicField$1(this, "$base");
221
+ __publicField$1(this, "$keyed");
222
+ this.$base = SharedSource($base);
223
+ this.$keyed = Shared($key);
224
+ }
225
+ event(transport) {
226
+ All(this.$base, this.$keyed).event(
227
+ Transport(([base, keyed]) => {
228
+ const keys = keyed.split(".");
190
229
  let value = base;
191
- keyChunks.forEach((keyChunk) => {
192
- value = value[keyChunk];
230
+ keys.forEach((key) => {
231
+ value = value[key];
193
232
  });
194
233
  if (value !== void 0 && value !== base) {
195
- user(value);
234
+ transport.use(value);
196
235
  }
236
+ })
237
+ );
238
+ return this;
239
+ }
240
+ use(value) {
241
+ const key = Primitive(this.$keyed);
242
+ if (isFilled(key)) {
243
+ const base = Primitive(this.$base);
244
+ this.$base.use({
245
+ ...base.primitiveWithException(),
246
+ [key.primitiveWithException()]: value
197
247
  });
198
- },
199
- use: (value) => {
200
- const key = keySync.primitive();
201
- if (isFilled(key)) {
202
- baseSrc.use({
203
- ...baseSync.primitive(),
204
- [key]: value
205
- });
206
- }
207
248
  }
208
- };
209
- }
210
-
211
- function Path(baseSrc, keySrc) {
212
- return (user) => {
213
- All(
214
- baseSrc,
215
- keySrc
216
- )(([base, key]) => {
217
- const keyChunks = key.split(".");
218
- let value = base;
219
- keyChunks.forEach((keyChunk) => {
220
- value = value[keyChunk];
221
- });
222
- if (value !== void 0 && value !== base) {
223
- user(value);
224
- }
225
- });
226
- };
227
- }
228
-
229
- function Polling(baseSrc, triggerSrc) {
230
- return (user) => {
231
- triggerSrc(() => {
232
- baseSrc(user);
233
- });
234
- };
249
+ return this;
250
+ }
235
251
  }
236
252
 
237
- function Shot(targetSrc, triggerSrc) {
238
- return (user) => {
239
- const targetSync = Primitive(targetSrc);
240
- triggerSrc(() => {
241
- const value = targetSync.primitive();
242
- if (isFilled(value)) {
243
- user(value);
244
- }
245
- });
246
- };
253
+ function Path($base, $keyed) {
254
+ return Event((transport) => {
255
+ All($base, $keyed).event(
256
+ Transport(([base, keyed]) => {
257
+ const keys = keyed.split(".");
258
+ let value = base;
259
+ keys.forEach((key) => {
260
+ value = value[key];
261
+ });
262
+ if (value !== void 0 && value !== base) {
263
+ transport.use(value);
264
+ }
265
+ })
266
+ );
267
+ });
268
+ }
269
+
270
+ function Polling($base, $trigger) {
271
+ return Event((transport) => {
272
+ $trigger.event(
273
+ Transport(() => {
274
+ $base.event(transport);
275
+ })
276
+ );
277
+ });
278
+ }
279
+
280
+ function Shot($target, $trigger) {
281
+ return Event((transport) => {
282
+ const targetSync = Primitive($target);
283
+ targetSync.primitive();
284
+ $trigger.event(
285
+ Transport(() => {
286
+ const value = targetSync.primitive();
287
+ if (isFilled(value)) {
288
+ transport.use(value);
289
+ }
290
+ })
291
+ );
292
+ });
247
293
  }
248
294
 
249
295
  function Task(baseSrc, delay = 0) {
250
- return (user) => {
296
+ return Event((transport) => {
251
297
  let prevTimer = null;
252
298
  ExecutorApplied(baseSrc, (fn) => {
253
299
  return (v) => {
@@ -258,12 +304,12 @@ function Task(baseSrc, delay = 0) {
258
304
  fn(v);
259
305
  }, delay);
260
306
  };
261
- })(user);
262
- };
307
+ }).event(transport);
308
+ });
263
309
  }
264
310
 
265
- function Tick(baseSrc) {
266
- return (user) => {
311
+ function Tick($base) {
312
+ return Event((transport) => {
267
313
  let microtaskScheduled = false;
268
314
  let lastValue = null;
269
315
  const scheduleMicrotask = () => {
@@ -271,272 +317,281 @@ function Tick(baseSrc) {
271
317
  queueMicrotask(() => {
272
318
  microtaskScheduled = false;
273
319
  if (lastValue !== null) {
274
- user(lastValue);
320
+ transport.use(lastValue);
275
321
  lastValue = null;
276
322
  }
277
323
  });
278
324
  };
279
- baseSrc((v) => {
280
- lastValue = v;
281
- if (!microtaskScheduled) {
282
- scheduleMicrotask();
283
- }
284
- });
285
- };
325
+ $base.event(
326
+ Transport((v) => {
327
+ lastValue = v;
328
+ if (!microtaskScheduled) {
329
+ scheduleMicrotask();
330
+ }
331
+ })
332
+ );
333
+ });
286
334
  }
287
335
 
288
336
  function Transaction($base, eventBuilder, ...args) {
289
- return (user) => {
337
+ return Event((transport) => {
290
338
  const $res = LateShared();
291
339
  const destructors = [];
292
- $base((v) => {
293
- const $event = Destructor(
294
- eventBuilder(Of(v), ...args.map((a) => Detached(a)))
295
- );
296
- destructors.push($event);
297
- $event.event($res.use);
298
- });
299
- $res.event(user);
340
+ $base.event(
341
+ Transport((v) => {
342
+ const $event = eventBuilder(Of(v), ...args.map((a) => Detached(a)));
343
+ destructors.push($event);
344
+ $event.event($res);
345
+ })
346
+ );
347
+ $res.event(transport);
300
348
  return () => {
301
- destructors.forEach((d) => d.destroy());
349
+ destructors.forEach((d) => d?.destroy());
302
350
  destructors.length = 0;
303
351
  };
304
- };
352
+ });
305
353
  }
306
354
 
307
- function HashTable(baseSrc) {
308
- return (user) => {
355
+ function HashTable($base) {
356
+ return Event((transport) => {
309
357
  const record = {};
310
- baseSrc(([key, value]) => {
311
- record[key] = value;
312
- user(record);
313
- });
314
- };
315
- }
316
-
317
- function RecordOf(recordSrc) {
318
- return (user) => {
319
- const keys = Object.keys(recordSrc);
320
- All(...Object.values(recordSrc))((entries) => {
321
- const record = {};
322
- entries.forEach((entry, index) => {
323
- record[keys[index]] = entry;
324
- });
325
- user(record);
326
- });
327
- };
358
+ $base.event(
359
+ Transport(([key, value]) => {
360
+ record[key] = value;
361
+ transport.use(record);
362
+ })
363
+ );
364
+ });
365
+ }
366
+
367
+ function RecordOf(record) {
368
+ return Event((transport) => {
369
+ const keys = Object.keys(record);
370
+ All(...Object.values(record)).event(
371
+ Transport((entries) => {
372
+ const record2 = {};
373
+ entries.forEach((entry, index) => {
374
+ record2[keys[index]] = entry;
375
+ });
376
+ transport.use(record2);
377
+ })
378
+ );
379
+ });
328
380
  }
329
381
 
330
382
  function Concatenated(sources, joinPartSrc = Of("")) {
331
- return (user) => {
332
- All(
333
- joinPartSrc,
334
- ...sources
335
- )(([joinPart, ...strings]) => {
336
- user(strings.join(joinPart));
383
+ return Event((transport) => {
384
+ All(joinPartSrc, ...sources).event(
385
+ Transport(([joinPart, ...strings]) => {
386
+ transport.use(strings.join(joinPart));
387
+ })
388
+ );
389
+ });
390
+ }
391
+
392
+ var __defProp = Object.defineProperty;
393
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
394
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
395
+ function Template($src = Of(""), $places = Of({})) {
396
+ return new TemplateEvent($src, $places);
397
+ }
398
+ class TemplateEvent {
399
+ constructor($src = Of(""), $places = Of({})) {
400
+ this.$src = $src;
401
+ this.$places = $places;
402
+ __publicField(this, "dc", DestroyContainer());
403
+ __publicField(this, "vars", {
404
+ $TPL: Of("$TPL")
337
405
  });
338
- };
339
- }
340
-
341
- function Template(theSrc = Of(""), placesSrc = Of({})) {
342
- let placesCounter = 0;
343
- const vars = {
344
- $TPL: Of("$TPL")
345
- };
346
- const destructors = [];
347
- return {
348
- value: (user) => {
349
- const varsSrc = RecordOf(vars);
350
- Applied(All(theSrc, placesSrc, varsSrc), ([base, rules, vars2]) => {
351
- Object.entries(rules).forEach(([ph, val]) => {
352
- base = base.replaceAll(ph, String(val));
353
- });
354
- Object.entries(vars2).forEach(([ph, val]) => {
355
- base = base.replaceAll(ph, String(val));
356
- });
357
- return base;
358
- })(user);
359
- },
360
- template: (value) => {
361
- theSrc = Of(value);
362
- },
363
- /**
364
- * Ability to register variable
365
- * in concrete place Of template
366
- */
367
- var: (src) => {
368
- const varName = `$var${placesCounter}`;
369
- placesCounter += 1;
370
- vars[varName] = Destructor(src, (d) => {
371
- destructors.push(d);
372
- }).event;
373
- return varName;
374
- },
375
- destroy() {
376
- destructors.forEach((d) => d());
406
+ }
407
+ event(transport) {
408
+ const $vars = RecordOf(this.vars);
409
+ Applied(All(this.$src, this.$places, $vars), ([base, rules, vars]) => {
410
+ Object.entries(rules).forEach(([ph, val]) => {
411
+ base = base.replaceAll(ph, String(val));
412
+ });
413
+ Object.entries(vars).forEach(([ph, val]) => {
414
+ base = base.replaceAll(ph, String(val));
415
+ });
416
+ return base;
417
+ }).event(transport);
418
+ return this;
419
+ }
420
+ template(value) {
421
+ this.$src = Of(value);
422
+ }
423
+ /**
424
+ * Ability to register variable
425
+ * in concrete place Of template
426
+ */
427
+ var(src) {
428
+ const places = Object.keys(this.vars).length;
429
+ const varName = `$var${places}`;
430
+ if (isDestroyable(src)) {
431
+ this.dc.add(src);
377
432
  }
378
- };
433
+ this.vars[varName] = src;
434
+ return varName;
435
+ }
436
+ destroy() {
437
+ return this;
438
+ }
379
439
  }
380
440
 
381
441
  function RegexpMatched(patternSrc, valueSrc, flagsSrc = Of("")) {
382
- return (user) => {
383
- All(
384
- patternSrc,
385
- valueSrc,
386
- flagsSrc
387
- )(([pattern, value, flags]) => {
388
- user(new RegExp(pattern, flags).test(value));
389
- });
390
- };
442
+ return Event((transport) => {
443
+ All(patternSrc, valueSrc, flagsSrc).event(
444
+ Transport(([pattern, value, flags]) => {
445
+ transport.use(new RegExp(pattern, flags).test(value));
446
+ })
447
+ );
448
+ });
391
449
  }
392
450
 
393
451
  function RegexpReplaced(valueSrc, patternSrc, replaceValueSrc, flagsSrc = Of("")) {
394
- return (user) => {
395
- All(
396
- patternSrc,
397
- valueSrc,
398
- replaceValueSrc,
399
- flagsSrc
400
- )(([pattern, value, replaceValue, flags]) => {
401
- user(String(value).replace(new RegExp(pattern, flags), replaceValue));
402
- });
403
- };
452
+ return Event((transport) => {
453
+ All(patternSrc, valueSrc, replaceValueSrc, flagsSrc).event(
454
+ Transport(([pattern, value, replaceValue, flags]) => {
455
+ transport.use(
456
+ String(value).replace(new RegExp(pattern, flags), replaceValue)
457
+ );
458
+ })
459
+ );
460
+ });
404
461
  }
405
462
 
406
463
  function RegexpMatch(patternSrc, valueSrc, flagsSrc = Of("")) {
407
- return (user) => {
408
- All(
409
- patternSrc,
410
- valueSrc,
411
- flagsSrc
412
- )(([pattern, value, flags]) => {
413
- const result = new RegExp(pattern, flags).exec(value);
414
- user(result ?? []);
415
- });
416
- };
464
+ return Event((transport) => {
465
+ All(patternSrc, valueSrc, flagsSrc).event(
466
+ Transport(([pattern, value, flags]) => {
467
+ const result = new RegExp(pattern, flags).exec(value);
468
+ transport.use(result ?? []);
469
+ })
470
+ );
471
+ });
417
472
  }
418
473
 
419
474
  function Set(baseSrc, keySrc, valueSrc) {
420
- return (user) => {
421
- All(
422
- baseSrc,
423
- keySrc,
424
- valueSrc
425
- )(([base, key, value]) => {
426
- base[key] = value;
427
- user(base);
428
- });
429
- };
430
- }
431
-
432
- const emptySrc = () => Of(false);
433
- function Router(urlSrc, routesSrc, defaultSrc) {
434
- return (user) => {
475
+ return Event((transport) => {
476
+ All(baseSrc, keySrc, valueSrc).event(
477
+ Transport(([base, key, value]) => {
478
+ base[key] = value;
479
+ transport.use(base);
480
+ })
481
+ );
482
+ });
483
+ }
484
+
485
+ const $empty = TransportEvent(() => Of(false));
486
+ function Router($url, $routes, $default) {
487
+ return Event((transport) => {
435
488
  const destructors = [];
436
- const destroyAllData = () => {
437
- destructors.forEach((d) => d());
489
+ const destructor = () => {
490
+ destructors.forEach((d) => d.destroy());
438
491
  destructors.length = 0;
439
492
  };
440
- All(
441
- routesSrc,
442
- urlSrc
443
- )(([routes, url]) => {
444
- destroyAllData();
445
- const instance = All(
446
- defaultSrc(),
447
- All(
448
- ...routes.map(
449
- (r) => Destructor(
450
- BranchLazy(
493
+ All($routes, $url).event(
494
+ Transport(([routes, url]) => {
495
+ destructor();
496
+ const instance = All(
497
+ $default.use(),
498
+ All(
499
+ ...routes.map((r) => {
500
+ const $template = TransportDestroyable(r.event);
501
+ destructors.push($template);
502
+ return BranchLazy(
451
503
  RegexpMatched(
452
504
  Of(r.pattern),
453
505
  Of(url),
454
506
  r.patternFlags ? Of(r.patternFlags) : void 0
455
507
  ),
456
- r.template,
457
- emptySrc
458
- ),
459
- (d) => destructors.push(d)
460
- ).event
508
+ $template,
509
+ $empty
510
+ );
511
+ })
461
512
  )
462
- )
463
- );
464
- Applied(instance, (r) => {
465
- const firstReal = r[1].find((r2) => r2 !== false);
466
- if (firstReal) {
467
- return firstReal;
513
+ );
514
+ Applied(instance, (r) => {
515
+ const first = r[1].find((r2) => r2 !== false);
516
+ if (first) {
517
+ return first;
518
+ }
519
+ return r[0];
520
+ }).event(transport);
521
+ })
522
+ );
523
+ return destructor;
524
+ });
525
+ }
526
+
527
+ function And($one, $two) {
528
+ return Event((transport) => {
529
+ All($one, $two).event(
530
+ Transport(([one, two]) => {
531
+ transport.use(one && two);
532
+ })
533
+ );
534
+ });
535
+ }
536
+
537
+ function Or($one, $two) {
538
+ return Event((transport) => {
539
+ All($one, $two).event(
540
+ Transport(([one, two]) => {
541
+ transport.use(one || two);
542
+ })
543
+ );
544
+ });
545
+ }
546
+
547
+ function Not($base) {
548
+ return Event((transport) => {
549
+ $base.event(
550
+ Transport((v) => {
551
+ transport.use(!v);
552
+ })
553
+ );
554
+ });
555
+ }
556
+
557
+ function Bool($base) {
558
+ return Event((transport) => {
559
+ Applied($base, Boolean).event(transport);
560
+ });
561
+ }
562
+
563
+ function FromJson($json, error) {
564
+ return Event((transport) => {
565
+ $json.event(
566
+ Transport((json) => {
567
+ try {
568
+ transport.use(JSON.parse(json));
569
+ } catch (e) {
570
+ error?.use(new Error(`Failed to parse JSON: ${e}`));
468
571
  }
469
- return r[0];
470
- })(user);
471
- });
472
- return destroyAllData;
473
- };
474
- }
475
-
476
- function And(oneSrc, twoSrc) {
477
- return (user) => {
478
- All(
479
- oneSrc,
480
- twoSrc
481
- )(([one, two]) => {
482
- user(one && two);
483
- });
484
- };
485
- }
486
-
487
- function Or(oneSrc, twoSrc) {
488
- return (user) => {
489
- All(
490
- oneSrc,
491
- twoSrc
492
- )(([one, two]) => {
493
- user(one || two);
494
- });
495
- };
496
- }
497
-
498
- function Not(baseSrc) {
499
- return (user) => {
500
- baseSrc((v) => {
501
- user(!v);
502
- });
503
- };
504
- }
505
-
506
- function Bool(baseSrc) {
507
- return (user) => {
508
- Applied(baseSrc, Boolean)(user);
509
- };
510
- }
511
-
512
- function FromJson(jsonSrc, errorOwner) {
513
- return (user) => {
514
- jsonSrc((json) => {
515
- try {
516
- user(JSON.parse(json));
517
- } catch (error) {
518
- errorOwner?.(new Error(`Failed to parse JSON: ${error}`));
519
- }
520
- });
521
- };
522
- }
523
-
524
- function ToJson(dataSrc, errorOwner) {
525
- return (user) => {
526
- dataSrc((data) => {
527
- try {
528
- user(JSON.stringify(data));
529
- } catch {
530
- errorOwner?.(new Error("Failed to convert to JSON"));
531
- }
532
- });
533
- };
572
+ })
573
+ );
574
+ });
575
+ }
576
+
577
+ function ToJson($data, error) {
578
+ return Event((transport) => {
579
+ $data.event(
580
+ Transport((data) => {
581
+ try {
582
+ transport.use(JSON.stringify(data));
583
+ } catch {
584
+ error?.use(new Error("Failed to convert to JSON"));
585
+ }
586
+ })
587
+ );
588
+ });
534
589
  }
535
590
 
536
- function First(baseSrc) {
537
- return (user) => {
538
- Applied(baseSrc, (a) => a[0])(user);
539
- };
591
+ function First($base) {
592
+ return Event((transport) => {
593
+ Applied($base, (a) => a[0]).event(transport);
594
+ });
540
595
  }
541
596
 
542
597
  export { And, Bool, Branch, BranchLazy, Concatenated, Constant, Deadline, Deferred, Detached, Dirty, First, FromJson, HashTable, Loading, Lock, Memo, Not, OnlyChanged, Or, Part, Path, Polling, RecordOf, RegexpMatch, RegexpMatched, RegexpReplaced, Router, Set, Shot, Task, Template, Tick, ToJson, Transaction };