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