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