silentium-components 0.0.83 → 0.0.85

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