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