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.
- package/CHANGELOG.md +14 -0
- package/dist/silentium-components.cjs +326 -411
- package/dist/silentium-components.cjs.map +1 -1
- package/dist/silentium-components.d.ts +80 -87
- package/dist/silentium-components.js +328 -412
- package/dist/silentium-components.js.map +1 -1
- package/dist/silentium-components.min.js +1 -1
- package/dist/silentium-components.min.mjs +1 -1
- package/dist/silentium-components.min.mjs.map +1 -1
- package/dist/silentium-components.mjs +328 -412
- package/dist/silentium-components.mjs.map +1 -1
- package/eslint.config.mjs +26 -12
- package/package.json +4 -2
- package/rollup.config.js +2 -1
- package/src/behaviors/Branch._main.test.ts +4 -3
- package/src/behaviors/Branch._values.test.ts +3 -2
- package/src/behaviors/Branch.branchesDontAffectResult.test.ts +4 -3
- package/src/behaviors/Branch.ts +13 -21
- package/src/behaviors/BranchLazy._main.test.ts +5 -4
- package/src/behaviors/BranchLazy.ts +17 -20
- package/src/behaviors/Const.test.ts +6 -7
- package/src/behaviors/Const.ts +5 -7
- package/src/behaviors/Deadline._main.test.ts +5 -4
- package/src/behaviors/Deadline._value.test.ts +4 -3
- package/src/behaviors/Deadline.ts +20 -27
- package/src/behaviors/Deferred.test.ts +5 -4
- package/src/behaviors/Deferred.ts +8 -10
- package/src/behaviors/Detached.test.ts +4 -3
- package/src/behaviors/Detached.ts +2 -2
- package/src/behaviors/Dirty.test.ts +4 -3
- package/src/behaviors/Dirty.ts +18 -45
- package/src/behaviors/Loading.test.ts +4 -3
- package/src/behaviors/Loading.ts +4 -4
- package/src/behaviors/Lock.test.ts +4 -3
- package/src/behaviors/Lock.ts +6 -8
- package/src/behaviors/Memo.test.ts +7 -8
- package/src/behaviors/Memo.ts +8 -10
- package/src/behaviors/OnlyChanged.test.ts +5 -4
- package/src/behaviors/OnlyChanged.ts +9 -11
- package/src/behaviors/Part.test.ts +12 -15
- package/src/behaviors/Part.ts +23 -40
- package/src/behaviors/Path._keyRaw.test.ts +3 -2
- package/src/behaviors/Path._main.test.ts +3 -2
- package/src/behaviors/Path.index.test.ts +3 -2
- package/src/behaviors/Path.nested.test.ts +4 -3
- package/src/behaviors/Path.ts +11 -14
- package/src/behaviors/Polling.test.ts +3 -2
- package/src/behaviors/Polling.ts +5 -7
- package/src/behaviors/Shot._main.test.ts +5 -4
- package/src/behaviors/Shot._onlyChanged.test.ts +9 -10
- package/src/behaviors/Shot.ts +8 -10
- package/src/behaviors/Task.test.ts +9 -12
- package/src/behaviors/Task.ts +11 -5
- package/src/behaviors/Tick.test.ts +5 -4
- package/src/behaviors/Tick.ts +9 -11
- package/src/behaviors/index.ts +0 -1
- package/src/boolean/And.test.ts +3 -2
- package/src/boolean/And.ts +5 -7
- package/src/boolean/Bool.test.ts +4 -3
- package/src/boolean/Bool.ts +2 -2
- package/src/boolean/Not.test.ts +4 -3
- package/src/boolean/Not.ts +5 -7
- package/src/boolean/Or.test.ts +4 -3
- package/src/boolean/Or.ts +5 -7
- package/src/boolean/index.ts +2 -2
- package/src/formats/FromJson.test.ts +2 -1
- package/src/formats/FromJson.ts +9 -12
- package/src/formats/ToJson.test.ts +1 -0
- package/src/formats/ToJson.ts +10 -12
- package/src/index.ts +4 -4
- package/src/lists/First.test.ts +3 -2
- package/src/lists/First.ts +2 -2
- package/src/navigation/Router._destroy.test.ts +14 -24
- package/src/navigation/Router._firstMatch.test.ts +7 -13
- package/src/navigation/Router._main.test.ts +7 -13
- package/src/navigation/Router._nested.test.ts +19 -30
- package/src/navigation/Router.ts +30 -34
- package/src/strings/Concatenated.test.ts +4 -3
- package/src/strings/Concatenated.ts +5 -7
- package/src/strings/Template._main.test.ts +5 -4
- package/src/strings/Template._place.test.ts +4 -3
- package/src/strings/Template.ts +21 -9
- package/src/structures/HashTable.test.ts +4 -3
- package/src/structures/HashTable.ts +6 -8
- package/src/structures/Record._main.test.ts +3 -2
- package/src/structures/Record._mixed.test.ts +3 -2
- package/src/structures/Record.concatenated.test.ts +7 -8
- package/src/structures/Record.nested.test.ts +3 -2
- package/src/structures/Record.ts +10 -14
- package/src/system/RegexpMatch._group.test.ts +3 -2
- package/src/system/RegexpMatch._main.test.ts +3 -2
- package/src/system/RegexpMatch.ts +12 -11
- package/src/system/RegexpMatched.test.ts +4 -3
- package/src/system/RegexpMatched.ts +11 -10
- package/src/system/RegexpReplaced.test.ts +4 -3
- package/src/system/RegexpReplaced.ts +6 -8
- package/src/system/Set.test.ts +4 -3
- package/src/system/Set.ts +9 -8
- package/src/system/index.ts +1 -1
- package/src/behaviors/Branch.dontRespondAfterRespond.test.ts +0 -35
- package/src/behaviors/Transaction.test.ts +0 -44
- package/src/behaviors/Transaction.ts +0 -42
|
@@ -1,305 +1,254 @@
|
|
|
1
|
-
import { ActualMessage, Message, Primitive,
|
|
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.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
})
|
|
60
|
-
);
|
|
51
|
+
return Message(function ConstantImpl(r) {
|
|
52
|
+
$trigger.then(() => {
|
|
53
|
+
r(permanent);
|
|
54
|
+
});
|
|
61
55
|
});
|
|
62
56
|
}
|
|
63
57
|
|
|
64
|
-
function Deadline(
|
|
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
|
|
69
|
-
$timeout.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
117
|
+
r(
|
|
144
118
|
Object.fromEntries(
|
|
145
119
|
Object.entries(comparing).filter(([key, value]) => {
|
|
146
|
-
if (
|
|
120
|
+
if (keep.includes(key)) {
|
|
147
121
|
return true;
|
|
148
122
|
}
|
|
149
|
-
if (
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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.
|
|
169
|
-
$finish.
|
|
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.
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
})
|
|
180
|
-
);
|
|
148
|
+
$lock.then((newLock) => {
|
|
149
|
+
locked = newLock;
|
|
150
|
+
});
|
|
181
151
|
const i = Filtered($base, () => !locked);
|
|
182
|
-
i.
|
|
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.
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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.
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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((
|
|
234
|
-
value = value[
|
|
189
|
+
keys.forEach((key2) => {
|
|
190
|
+
value = value[key2];
|
|
235
191
|
});
|
|
236
192
|
if (value !== void 0 && value !== base) {
|
|
237
|
-
|
|
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
|
-
|
|
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).
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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.
|
|
277
|
-
|
|
278
|
-
|
|
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.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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
|
-
|
|
248
|
+
const $base = ActualMessage(baseSrc);
|
|
249
|
+
return Message(function TaskImpl(r) {
|
|
301
250
|
let prevTimer = null;
|
|
302
|
-
ExecutorApplied(
|
|
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
|
-
}).
|
|
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
|
-
|
|
273
|
+
r(lastValue);
|
|
325
274
|
lastValue = null;
|
|
326
275
|
}
|
|
327
276
|
});
|
|
328
277
|
};
|
|
329
|
-
$base.
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
|
341
|
-
return Message(function() {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
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
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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.
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
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
|
-
|
|
376
|
-
|
|
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
|
-
|
|
477
|
+
then(transport) {
|
|
417
478
|
const $vars = Record(this.vars);
|
|
418
479
|
Applied(All(this.$src, this.$places, $vars), ([base, rules, vars]) => {
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
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
|
-
}).
|
|
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
|
-
|
|
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
|