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