semantic-typescript 0.5.3 → 0.6.0
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/dist/asynchronous/collector.d.ts +231 -0
- package/dist/asynchronous/collector.js +800 -0
- package/dist/asynchronous/semantic.d.ts +257 -0
- package/dist/asynchronous/semantic.js +1853 -0
- package/dist/factory.d.ts +71 -37
- package/dist/factory.js +443 -262
- package/dist/guard.d.ts +24 -14
- package/dist/guard.js +73 -19
- package/dist/hook.d.ts +6 -6
- package/dist/hook.js +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/optional.d.ts +2 -2
- package/dist/symbol.d.ts +19 -10
- package/dist/symbol.js +19 -10
- package/dist/synchronous/collector.d.ts +232 -0
- package/dist/{collector.js → synchronous/collector.js} +160 -151
- package/dist/{semantic.d.ts → synchronous/semantic.d.ts} +111 -120
- package/dist/{semantic.js → synchronous/semantic.js} +299 -337
- package/dist/utility.d.ts +7 -1
- package/dist/utility.js +1 -0
- package/package.json +1 -1
- package/readme.cn.md +158 -697
- package/readme.de.md +163 -432
- package/readme.es.md +163 -433
- package/readme.fr.md +162 -444
- package/readme.jp.md +162 -442
- package/readme.kr.md +161 -430
- package/readme.md +157 -1009
- package/readme.ru.md +161 -426
- package/readme.tw.md +161 -436
- package/dist/collector.d.ts +0 -236
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -4
- package/dist/map.d.ts +0 -76
- package/dist/map.js +0 -245
- package/dist/node.d.ts +0 -182
- package/dist/node.js +0 -918
- package/dist/set.d.ts +0 -19
- package/dist/set.js +0 -65
- package/dist/tree.d.ts +0 -82
- package/dist/tree.js +0 -257
package/dist/factory.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
import { AsynchronousSemantic } from "./asynchronous/semantic";
|
|
1
2
|
import { isBigInt, isFunction, isIterable, isNumber, isObject, isPromise, isAsyncIterable, isString, isHTMLElemet } from "./guard";
|
|
2
3
|
import { useCompare, useToBigInt, useToNumber, useTraverse } from "./hook";
|
|
3
4
|
import { Optional } from "./optional";
|
|
4
|
-
import {
|
|
5
|
+
import { SynchronousSemantic } from "./synchronous/semantic";
|
|
5
6
|
import { invalidate, validate } from "./utility";
|
|
6
7
|
;
|
|
7
8
|
export let useAnimationFrame = (period, delay = 0) => {
|
|
8
9
|
if (period <= 0 || !Number.isFinite(period) || delay < 0 || !Number.isFinite(delay)) {
|
|
9
10
|
throw new TypeError("Period must be positive finite number and delay must be non-negative finite number.");
|
|
10
11
|
}
|
|
11
|
-
return new
|
|
12
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
12
13
|
try {
|
|
13
14
|
let start = performance.now();
|
|
14
15
|
let index = 0n;
|
|
@@ -35,7 +36,7 @@ export let useAnimationFrame = (period, delay = 0) => {
|
|
|
35
36
|
;
|
|
36
37
|
export let useAttribute = (target) => {
|
|
37
38
|
if (isObject(target)) {
|
|
38
|
-
return new
|
|
39
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
39
40
|
try {
|
|
40
41
|
let index = 0n;
|
|
41
42
|
useTraverse(target, (key, value) => {
|
|
@@ -67,7 +68,7 @@ export let useBlob = (blob, chunk = 64n * 1024n) => {
|
|
|
67
68
|
if (invalidate(blob)) {
|
|
68
69
|
throw new TypeError("Blob is invalid.");
|
|
69
70
|
}
|
|
70
|
-
return new
|
|
71
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
71
72
|
try {
|
|
72
73
|
let index = 0n;
|
|
73
74
|
let stoppable = false;
|
|
@@ -130,265 +131,348 @@ export let useBlob = (blob, chunk = 64n * 1024n) => {
|
|
|
130
131
|
});
|
|
131
132
|
};
|
|
132
133
|
;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
;
|
|
135
|
+
export let useDocument = (argument1, argument2 = {}) => {
|
|
136
|
+
let options = argument2;
|
|
137
|
+
let debounce = isObject(options) && isNumber(options.debounce) ? options.debounce : 0;
|
|
138
|
+
let throttle = isObject(options) && isNumber(options.throttle) ? options.throttle : 0;
|
|
139
|
+
if (isString(argument1)) {
|
|
140
|
+
let key = argument1;
|
|
141
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
142
|
+
let timeOut = null;
|
|
143
|
+
let lastEmitTime = 0;
|
|
144
|
+
let index = 0n;
|
|
145
|
+
let until = new Promise(resolve => {
|
|
139
146
|
let listener = (event) => {
|
|
140
|
-
if (
|
|
141
|
-
|
|
147
|
+
if (debounce > 0) {
|
|
148
|
+
if (timeOut) {
|
|
149
|
+
clearTimeout(timeOut);
|
|
150
|
+
}
|
|
151
|
+
timeOut = setTimeout(() => {
|
|
152
|
+
if (interrupt(event, index)) {
|
|
153
|
+
window.document.removeEventListener(key, listener);
|
|
154
|
+
resolve();
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
accept(event, index);
|
|
158
|
+
index++;
|
|
159
|
+
}, debounce);
|
|
160
|
+
return;
|
|
142
161
|
}
|
|
143
|
-
|
|
162
|
+
if (throttle > 0) {
|
|
163
|
+
let now = performance.now();
|
|
164
|
+
if (now - lastEmitTime < throttle) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
lastEmitTime = now;
|
|
168
|
+
if (interrupt(event, index)) {
|
|
169
|
+
window.document.removeEventListener(key, listener);
|
|
170
|
+
resolve();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
144
173
|
accept(event, index);
|
|
145
174
|
index++;
|
|
175
|
+
return;
|
|
146
176
|
}
|
|
177
|
+
if (interrupt(event, index)) {
|
|
178
|
+
window.document.removeEventListener(key, listener);
|
|
179
|
+
resolve();
|
|
180
|
+
accept(event, -1n);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
accept(event, index);
|
|
184
|
+
index++;
|
|
147
185
|
};
|
|
148
186
|
window.document.addEventListener(key, listener);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
console.error(error);
|
|
152
|
-
}
|
|
187
|
+
});
|
|
188
|
+
await until;
|
|
153
189
|
});
|
|
154
190
|
}
|
|
155
|
-
if (isIterable(
|
|
156
|
-
let keys = new Set(
|
|
157
|
-
return new
|
|
158
|
-
|
|
159
|
-
|
|
191
|
+
if (isIterable(argument1)) {
|
|
192
|
+
let keys = new Set(...argument1);
|
|
193
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
194
|
+
let lastEmitTime = 0;
|
|
195
|
+
let timeOut = null;
|
|
196
|
+
let index = 0n;
|
|
197
|
+
let activeCount = keys.size;
|
|
198
|
+
let until = new Promise(resolve => {
|
|
160
199
|
for (let key of keys) {
|
|
161
|
-
if (isString(key))
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
200
|
+
if (!isString(key))
|
|
201
|
+
continue;
|
|
202
|
+
let listener = (event) => {
|
|
203
|
+
if (debounce > 0) {
|
|
204
|
+
if (timeOut) {
|
|
205
|
+
clearTimeout(timeOut);
|
|
165
206
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
207
|
+
timeOut = setTimeout(() => handleEvent(event, key), debounce);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (throttle > 0) {
|
|
211
|
+
let now = performance.now();
|
|
212
|
+
if (now - lastEmitTime < throttle)
|
|
213
|
+
return;
|
|
214
|
+
lastEmitTime = now;
|
|
215
|
+
}
|
|
216
|
+
handleEvent(event, key);
|
|
217
|
+
};
|
|
218
|
+
let handleEvent = (event, currentKey) => {
|
|
219
|
+
if (interrupt(event, index)) {
|
|
220
|
+
window.document.removeEventListener(currentKey, listener);
|
|
221
|
+
if (--activeCount === 0) {
|
|
222
|
+
resolve();
|
|
169
223
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
accept(event, index);
|
|
227
|
+
index++;
|
|
228
|
+
};
|
|
229
|
+
window.document.addEventListener(key, listener);
|
|
173
230
|
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
console.error(error);
|
|
177
|
-
}
|
|
231
|
+
});
|
|
232
|
+
await until;
|
|
178
233
|
});
|
|
179
234
|
}
|
|
180
|
-
throw new TypeError("
|
|
235
|
+
throw new TypeError("Invalid arguments.");
|
|
181
236
|
};
|
|
182
237
|
;
|
|
183
|
-
export let useHTMLElement = (argument1, argument2) => {
|
|
238
|
+
export let useHTMLElement = (argument1, argument2, argument3 = {}) => {
|
|
239
|
+
let throttle = isObject(argument3) && isNumber(argument3.throttle) ? argument3.throttle : 0;
|
|
240
|
+
let debounce = isObject(argument3) && isNumber(argument3.debounce) ? argument3.debounce : 0;
|
|
241
|
+
if (debounce > 0 && throttle > 0) {
|
|
242
|
+
throw new TypeError("throttle and debounce cannot be used together");
|
|
243
|
+
}
|
|
244
|
+
if (debounce < 0 || throttle < 0) {
|
|
245
|
+
throw new TypeError("throttle/debounce must be non-negative");
|
|
246
|
+
}
|
|
247
|
+
if (isHTMLElemet(argument1)) {
|
|
248
|
+
let element = argument1;
|
|
249
|
+
if (isString(argument2)) {
|
|
250
|
+
let key = argument2;
|
|
251
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
252
|
+
let timeOut = null;
|
|
253
|
+
let lastEmit = 0;
|
|
254
|
+
let index = 0n;
|
|
255
|
+
let until = new Promise((resolve) => {
|
|
256
|
+
let listener = (event) => {
|
|
257
|
+
if (debounce > 0) {
|
|
258
|
+
if (timeOut)
|
|
259
|
+
clearTimeout(timeOut);
|
|
260
|
+
timeOut = setTimeout(() => handle(event), debounce);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (throttle > 0) {
|
|
264
|
+
let now = performance.now();
|
|
265
|
+
if (now - lastEmit < throttle)
|
|
266
|
+
return;
|
|
267
|
+
lastEmit = now;
|
|
268
|
+
}
|
|
269
|
+
handle(event);
|
|
270
|
+
};
|
|
271
|
+
let handle = (event) => {
|
|
272
|
+
if (interrupt(event, index)) {
|
|
273
|
+
element.removeEventListener(key, listener);
|
|
274
|
+
if (timeOut)
|
|
275
|
+
clearTimeout(timeOut);
|
|
276
|
+
resolve();
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
accept(event, index);
|
|
280
|
+
index++;
|
|
281
|
+
};
|
|
282
|
+
element.addEventListener(key, listener);
|
|
283
|
+
});
|
|
284
|
+
await until;
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
if (isIterable(argument2)) {
|
|
288
|
+
let keys = [...new Set(argument2)];
|
|
289
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
290
|
+
let active = keys.length;
|
|
291
|
+
let index = 0n;
|
|
292
|
+
let until = new Promise((resolve) => {
|
|
293
|
+
for (let key of keys) {
|
|
294
|
+
let listener = (event) => {
|
|
295
|
+
if (interrupt(event, index)) {
|
|
296
|
+
element.removeEventListener(key, listener);
|
|
297
|
+
if (--active === 0) {
|
|
298
|
+
resolve();
|
|
299
|
+
}
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
accept(event, index);
|
|
303
|
+
index++;
|
|
304
|
+
};
|
|
305
|
+
element.addEventListener(key, listener);
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
await until;
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
184
312
|
if (isString(argument1)) {
|
|
185
313
|
let selector = argument1;
|
|
314
|
+
let elements = [...document.querySelectorAll(selector)];
|
|
186
315
|
if (isString(argument2)) {
|
|
187
316
|
let key = argument2;
|
|
188
|
-
return new
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
317
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
318
|
+
let active = elements.length;
|
|
319
|
+
let index = 0n;
|
|
320
|
+
let until = new Promise((resolve) => {
|
|
192
321
|
for (let element of elements) {
|
|
193
322
|
if (validate(element)) {
|
|
194
323
|
let listener = (event) => {
|
|
195
324
|
if (interrupt(event, index)) {
|
|
196
325
|
element.removeEventListener(key, listener);
|
|
326
|
+
if (--active === 0) {
|
|
327
|
+
resolve();
|
|
328
|
+
}
|
|
329
|
+
return;
|
|
197
330
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
index++;
|
|
201
|
-
}
|
|
331
|
+
accept(event, index);
|
|
332
|
+
index++;
|
|
202
333
|
};
|
|
203
334
|
element.addEventListener(key, listener);
|
|
204
335
|
}
|
|
205
336
|
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
console.error(error);
|
|
209
|
-
}
|
|
337
|
+
});
|
|
338
|
+
await until;
|
|
210
339
|
});
|
|
211
340
|
}
|
|
212
341
|
if (isIterable(argument2)) {
|
|
213
342
|
let keys = new Set(argument2);
|
|
214
|
-
return new
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
343
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
344
|
+
let active = elements.length * keys.size;
|
|
345
|
+
let index = 0n;
|
|
346
|
+
let until = new Promise((resolve) => {
|
|
218
347
|
for (let element of elements) {
|
|
219
348
|
for (let key of keys) {
|
|
220
|
-
if (isString(key)) {
|
|
349
|
+
if (validate(element) && isString(key)) {
|
|
221
350
|
let listener = (event) => {
|
|
222
351
|
if (interrupt(event, index)) {
|
|
223
352
|
element.removeEventListener(key, listener);
|
|
353
|
+
if (--active === 0) {
|
|
354
|
+
resolve();
|
|
355
|
+
}
|
|
356
|
+
return;
|
|
224
357
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
index++;
|
|
228
|
-
}
|
|
358
|
+
accept(event, index);
|
|
359
|
+
index++;
|
|
229
360
|
};
|
|
230
361
|
element.addEventListener(key, listener);
|
|
231
362
|
}
|
|
232
363
|
}
|
|
233
364
|
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
console.error(error);
|
|
237
|
-
}
|
|
365
|
+
});
|
|
366
|
+
await until;
|
|
238
367
|
});
|
|
239
368
|
}
|
|
240
369
|
}
|
|
241
370
|
if (isIterable(argument1)) {
|
|
242
|
-
let elementsOrSelectors = argument1;
|
|
371
|
+
let elementsOrSelectors = new Set(argument1);
|
|
243
372
|
if (isString(argument2)) {
|
|
244
373
|
let key = argument2;
|
|
245
|
-
return new
|
|
246
|
-
|
|
247
|
-
|
|
374
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
375
|
+
let active = elementsOrSelectors.size;
|
|
376
|
+
let until = new Promise((resolve) => {
|
|
248
377
|
for (let elementOrSelector of elementsOrSelectors) {
|
|
249
|
-
if (
|
|
250
|
-
|
|
251
|
-
|
|
378
|
+
if (validate(elementOrSelector)) {
|
|
379
|
+
if (isHTMLElemet(elementOrSelector)) {
|
|
380
|
+
let element = elementOrSelector;
|
|
252
381
|
let listener = (event) => {
|
|
253
|
-
if (interrupt(event,
|
|
382
|
+
if (interrupt(event, 0n)) {
|
|
254
383
|
element.removeEventListener(key, listener);
|
|
384
|
+
if (--active === 0) {
|
|
385
|
+
resolve();
|
|
386
|
+
}
|
|
387
|
+
return;
|
|
255
388
|
}
|
|
256
|
-
|
|
257
|
-
accept(event, index);
|
|
258
|
-
index++;
|
|
259
|
-
}
|
|
389
|
+
accept(event, 0n);
|
|
260
390
|
};
|
|
261
391
|
element.addEventListener(key, listener);
|
|
262
392
|
}
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
element.removeEventListener(key, listener);
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
accept(event, index);
|
|
272
|
-
index++;
|
|
273
|
-
}
|
|
274
|
-
};
|
|
275
|
-
element.addEventListener(key, listener);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
catch (error) {
|
|
280
|
-
console.error(error);
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
if (isIterable(argument2)) {
|
|
285
|
-
let keys = argument2;
|
|
286
|
-
return new Semantic((accept, interrupt) => {
|
|
287
|
-
try {
|
|
288
|
-
let index = 0n;
|
|
289
|
-
for (let elementOrSelector of elementsOrSelectors) {
|
|
290
|
-
if (isString(elementOrSelector)) {
|
|
291
|
-
let element = window.document.querySelector(elementOrSelector);
|
|
292
|
-
if (validate(element)) {
|
|
293
|
-
for (let key of keys) {
|
|
294
|
-
if (isString(key)) {
|
|
393
|
+
else if (isString(elementOrSelector)) {
|
|
394
|
+
let selector = elementOrSelector;
|
|
395
|
+
let elements = [...document.querySelectorAll(selector)].filter((item) => isHTMLElemet(item));
|
|
396
|
+
for (let element of elements) {
|
|
397
|
+
if (validate(element)) {
|
|
295
398
|
let listener = (event) => {
|
|
296
|
-
if (interrupt(event,
|
|
399
|
+
if (interrupt(event, 0n)) {
|
|
297
400
|
element.removeEventListener(key, listener);
|
|
401
|
+
if (--active === 0) {
|
|
402
|
+
resolve();
|
|
403
|
+
}
|
|
404
|
+
return;
|
|
298
405
|
}
|
|
299
|
-
|
|
300
|
-
accept(event, index);
|
|
301
|
-
index++;
|
|
302
|
-
}
|
|
406
|
+
accept(event, 0n);
|
|
303
407
|
};
|
|
304
408
|
element.addEventListener(key, listener);
|
|
305
409
|
}
|
|
306
410
|
}
|
|
307
411
|
}
|
|
308
412
|
}
|
|
309
|
-
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
await until;
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
if (isIterable(argument2)) {
|
|
419
|
+
let keys = new Set(argument2);
|
|
420
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
421
|
+
let active = elementsOrSelectors.size * keys.size;
|
|
422
|
+
let until = new Promise((resolve) => {
|
|
423
|
+
for (let elementOrSelector of elementsOrSelectors) {
|
|
424
|
+
if (isHTMLElemet(elementOrSelector)) {
|
|
310
425
|
let element = elementOrSelector;
|
|
311
426
|
for (let key of keys) {
|
|
312
427
|
if (isString(key)) {
|
|
313
428
|
let listener = (event) => {
|
|
314
|
-
if (interrupt(event,
|
|
429
|
+
if (interrupt(event, 0n)) {
|
|
315
430
|
element.removeEventListener(key, listener);
|
|
431
|
+
if (--active === 0) {
|
|
432
|
+
resolve();
|
|
433
|
+
}
|
|
434
|
+
return;
|
|
316
435
|
}
|
|
317
|
-
|
|
318
|
-
accept(event, index);
|
|
319
|
-
index++;
|
|
320
|
-
}
|
|
436
|
+
accept(event, 0n);
|
|
321
437
|
};
|
|
322
438
|
element.addEventListener(key, listener);
|
|
323
439
|
}
|
|
324
440
|
}
|
|
325
441
|
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
if (interrupt(event, index)) {
|
|
343
|
-
element.removeEventListener(key, listener);
|
|
344
|
-
}
|
|
345
|
-
else {
|
|
346
|
-
accept(event, index);
|
|
347
|
-
index++;
|
|
348
|
-
}
|
|
349
|
-
};
|
|
350
|
-
element.addEventListener(key, listener);
|
|
351
|
-
}
|
|
352
|
-
catch (error) {
|
|
353
|
-
console.error(error);
|
|
354
|
-
}
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
if (isIterable(argument2)) {
|
|
358
|
-
let keys = argument2;
|
|
359
|
-
return new Semantic((accept, interrupt) => {
|
|
360
|
-
try {
|
|
361
|
-
let index = 0n;
|
|
362
|
-
for (let key of keys) {
|
|
363
|
-
if (isString(key)) {
|
|
364
|
-
let listener = (event) => {
|
|
365
|
-
if (interrupt(event, index)) {
|
|
366
|
-
element.removeEventListener(key, listener);
|
|
367
|
-
}
|
|
368
|
-
else {
|
|
369
|
-
accept(event, index);
|
|
370
|
-
index++;
|
|
442
|
+
else if (isString(elementOrSelector)) {
|
|
443
|
+
let selector = elementOrSelector;
|
|
444
|
+
let elements = [...document.querySelectorAll(selector)].filter((item) => isHTMLElemet(item));
|
|
445
|
+
for (let element of elements) {
|
|
446
|
+
for (let key of keys) {
|
|
447
|
+
let listener = (event) => {
|
|
448
|
+
if (interrupt(event, 0n)) {
|
|
449
|
+
element.removeEventListener(key, listener);
|
|
450
|
+
if (--active === 0) {
|
|
451
|
+
resolve();
|
|
452
|
+
}
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
accept(event, 0n);
|
|
456
|
+
};
|
|
457
|
+
element.addEventListener(key, listener);
|
|
371
458
|
}
|
|
372
|
-
}
|
|
373
|
-
element.addEventListener(key, listener);
|
|
459
|
+
}
|
|
374
460
|
}
|
|
375
461
|
}
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
console.error(error);
|
|
379
|
-
}
|
|
462
|
+
});
|
|
463
|
+
await until;
|
|
380
464
|
});
|
|
381
465
|
}
|
|
382
466
|
}
|
|
383
467
|
throw new TypeError("Invalid arguments.");
|
|
384
468
|
};
|
|
385
469
|
export let useEmpty = () => {
|
|
386
|
-
return new
|
|
470
|
+
return new SynchronousSemantic(() => { });
|
|
387
471
|
};
|
|
388
472
|
;
|
|
389
473
|
export let useFill = (element, count) => {
|
|
390
474
|
if (validate(element) && count > 0n) {
|
|
391
|
-
return new
|
|
475
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
392
476
|
try {
|
|
393
477
|
for (let i = 0n; i < count; i++) {
|
|
394
478
|
let item = isFunction(element) ? element() : element;
|
|
@@ -408,7 +492,7 @@ export let useFill = (element, count) => {
|
|
|
408
492
|
;
|
|
409
493
|
export let useFrom = (iterable) => {
|
|
410
494
|
if (isIterable(iterable)) {
|
|
411
|
-
return new
|
|
495
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
412
496
|
try {
|
|
413
497
|
let index = 0n;
|
|
414
498
|
for (let element of iterable) {
|
|
@@ -425,7 +509,7 @@ export let useFrom = (iterable) => {
|
|
|
425
509
|
});
|
|
426
510
|
}
|
|
427
511
|
else if (isAsyncIterable(iterable)) {
|
|
428
|
-
return new
|
|
512
|
+
return new SynchronousSemantic(async (accept, interrupt) => {
|
|
429
513
|
try {
|
|
430
514
|
let index = 0n;
|
|
431
515
|
for await (let element of iterable) {
|
|
@@ -446,7 +530,7 @@ export let useFrom = (iterable) => {
|
|
|
446
530
|
;
|
|
447
531
|
export let useGenerate = (supplier, interrupt) => {
|
|
448
532
|
if (isFunction(supplier) && isFunction(interrupt)) {
|
|
449
|
-
return new
|
|
533
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
450
534
|
try {
|
|
451
535
|
let index = 0n;
|
|
452
536
|
while (true) {
|
|
@@ -468,7 +552,7 @@ export let useGenerate = (supplier, interrupt) => {
|
|
|
468
552
|
;
|
|
469
553
|
export let useInterval = (period, delay = 0) => {
|
|
470
554
|
if (period > 0 && delay >= 0) {
|
|
471
|
-
return new
|
|
555
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
472
556
|
try {
|
|
473
557
|
if (delay > 0) {
|
|
474
558
|
setTimeout(() => {
|
|
@@ -507,7 +591,7 @@ export let useInterval = (period, delay = 0) => {
|
|
|
507
591
|
export let useIterate = (generator) => {
|
|
508
592
|
if (isFunction(generator)) {
|
|
509
593
|
try {
|
|
510
|
-
return new
|
|
594
|
+
return new SynchronousSemantic(generator);
|
|
511
595
|
}
|
|
512
596
|
catch (error) {
|
|
513
597
|
console.error(error);
|
|
@@ -517,7 +601,7 @@ export let useIterate = (generator) => {
|
|
|
517
601
|
};
|
|
518
602
|
export let usePromise = (promise) => {
|
|
519
603
|
if (isPromise(promise)) {
|
|
520
|
-
return new
|
|
604
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
521
605
|
try {
|
|
522
606
|
promise.then((value) => {
|
|
523
607
|
if (interrupt(value, 0n)) {
|
|
@@ -540,7 +624,7 @@ export let usePromise = (promise) => {
|
|
|
540
624
|
;
|
|
541
625
|
export let useOf = (...target) => {
|
|
542
626
|
if (Array.isArray(target)) {
|
|
543
|
-
return new
|
|
627
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
544
628
|
try {
|
|
545
629
|
let index = 0n;
|
|
546
630
|
for (let element of target) {
|
|
@@ -565,7 +649,7 @@ export let useRange = (start, end, step = (isNumber(start) && isNumber(end) ? 1
|
|
|
565
649
|
}
|
|
566
650
|
if (isNumber(start) && isNumber(end)) {
|
|
567
651
|
let trusted = useToNumber(step);
|
|
568
|
-
return new
|
|
652
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
569
653
|
try {
|
|
570
654
|
let index = 0n;
|
|
571
655
|
for (let i = start; i < end; i += trusted) {
|
|
@@ -583,7 +667,7 @@ export let useRange = (start, end, step = (isNumber(start) && isNumber(end) ? 1
|
|
|
583
667
|
}
|
|
584
668
|
else if (isBigInt(start) && isBigInt(end)) {
|
|
585
669
|
let trusted = useToBigInt(step);
|
|
586
|
-
return new
|
|
670
|
+
return new SynchronousSemantic((accept, interrupt) => {
|
|
587
671
|
try {
|
|
588
672
|
let index = 0n;
|
|
589
673
|
for (let i = start; i < end; i += trusted) {
|
|
@@ -602,120 +686,217 @@ export let useRange = (start, end, step = (isNumber(start) && isNumber(end) ? 1
|
|
|
602
686
|
throw new TypeError("Invalid arguments.");
|
|
603
687
|
};
|
|
604
688
|
;
|
|
605
|
-
|
|
606
|
-
|
|
689
|
+
;
|
|
690
|
+
export let useWebSocket = (argument1, argument2, argument3) => {
|
|
691
|
+
let debounce = 0;
|
|
692
|
+
let throttle = 0;
|
|
693
|
+
if (isObject(argument2)) {
|
|
694
|
+
debounce = Reflect.has(argument2, "debounce") ? Reflect.get(argument2, "debounce") : 0;
|
|
695
|
+
throttle = Reflect.has(argument2, "throttle") ? Reflect.get(argument2, "throttle") : 0;
|
|
696
|
+
}
|
|
697
|
+
else {
|
|
698
|
+
debounce = validate(argument3) && isNumber(argument3.debounce) ? argument3.debounce : 0;
|
|
699
|
+
throttle = validate(argument3) && isNumber(argument3.throttle) ? argument3.throttle : 0;
|
|
700
|
+
}
|
|
701
|
+
if (validate(argument1)) {
|
|
607
702
|
let websocket = argument1;
|
|
608
703
|
if (isString(argument2)) {
|
|
609
|
-
let key =
|
|
610
|
-
return new
|
|
611
|
-
|
|
704
|
+
let key = argument1;
|
|
705
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
706
|
+
let timeOut = null;
|
|
707
|
+
let lastEmitTime = 0;
|
|
708
|
+
let index = 0n;
|
|
709
|
+
let until = new Promise(resolve => {
|
|
612
710
|
let listener = (event) => {
|
|
613
|
-
if (
|
|
614
|
-
|
|
711
|
+
if (debounce > 0) {
|
|
712
|
+
if (timeOut) {
|
|
713
|
+
clearTimeout(timeOut);
|
|
714
|
+
}
|
|
715
|
+
timeOut = setTimeout(() => {
|
|
716
|
+
if (interrupt(event, index)) {
|
|
717
|
+
websocket.removeEventListener(key, listener);
|
|
718
|
+
resolve();
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
accept(event, index);
|
|
722
|
+
index++;
|
|
723
|
+
}, debounce);
|
|
724
|
+
return;
|
|
615
725
|
}
|
|
616
|
-
|
|
617
|
-
|
|
726
|
+
if (throttle > 0) {
|
|
727
|
+
let now = performance.now();
|
|
728
|
+
if (now - lastEmitTime < throttle) {
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
lastEmitTime = now;
|
|
732
|
+
if (interrupt(event, index)) {
|
|
733
|
+
websocket.removeEventListener(key, listener);
|
|
734
|
+
resolve();
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
737
|
+
accept(event, index);
|
|
738
|
+
index++;
|
|
739
|
+
return;
|
|
618
740
|
}
|
|
741
|
+
if (interrupt(event, index)) {
|
|
742
|
+
websocket.removeEventListener(key, listener);
|
|
743
|
+
resolve();
|
|
744
|
+
accept(event, -1n);
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
accept(event, index);
|
|
748
|
+
index++;
|
|
619
749
|
};
|
|
620
750
|
websocket.addEventListener(key, listener);
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
console.error(error);
|
|
624
|
-
}
|
|
751
|
+
});
|
|
752
|
+
await until;
|
|
625
753
|
});
|
|
626
754
|
}
|
|
627
|
-
|
|
628
|
-
let keys =
|
|
629
|
-
return new
|
|
630
|
-
|
|
755
|
+
if (isIterable(argument2)) {
|
|
756
|
+
let keys = new Set(...argument1);
|
|
757
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
758
|
+
let lastEmitTime = 0;
|
|
759
|
+
let timeOut = null;
|
|
760
|
+
let index = 0n;
|
|
761
|
+
let activeCount = keys.size;
|
|
762
|
+
let until = new Promise(resolve => {
|
|
631
763
|
for (let key of keys) {
|
|
632
|
-
if (isString(key))
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
764
|
+
if (!isString(key))
|
|
765
|
+
continue;
|
|
766
|
+
let listener = (event) => {
|
|
767
|
+
if (debounce > 0) {
|
|
768
|
+
if (timeOut) {
|
|
769
|
+
clearTimeout(timeOut);
|
|
636
770
|
}
|
|
637
|
-
|
|
638
|
-
|
|
771
|
+
timeOut = setTimeout(() => handleEvent(event, key), debounce);
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
774
|
+
if (throttle > 0) {
|
|
775
|
+
let now = performance.now();
|
|
776
|
+
if (now - lastEmitTime < throttle)
|
|
777
|
+
return;
|
|
778
|
+
lastEmitTime = now;
|
|
779
|
+
}
|
|
780
|
+
handleEvent(event, key);
|
|
781
|
+
};
|
|
782
|
+
let handleEvent = (event, currentKey) => {
|
|
783
|
+
if (interrupt(event, index)) {
|
|
784
|
+
websocket.removeEventListener(currentKey, listener);
|
|
785
|
+
if (--activeCount === 0) {
|
|
786
|
+
resolve();
|
|
639
787
|
}
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
accept(event, index);
|
|
791
|
+
index++;
|
|
792
|
+
};
|
|
793
|
+
websocket.addEventListener(key, listener);
|
|
643
794
|
}
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
console.error(error);
|
|
647
|
-
}
|
|
795
|
+
});
|
|
796
|
+
await until;
|
|
648
797
|
});
|
|
649
798
|
}
|
|
650
|
-
let keys = ["open", "message", "close", "error"];
|
|
651
|
-
return new Semantic((accept, interrupt) => {
|
|
652
|
-
try {
|
|
653
|
-
for (let key of keys) {
|
|
654
|
-
let listener = (event) => {
|
|
655
|
-
if (interrupt(event, 0n)) {
|
|
656
|
-
websocket.removeEventListener(key, listener);
|
|
657
|
-
}
|
|
658
|
-
else {
|
|
659
|
-
accept(event, 0n);
|
|
660
|
-
}
|
|
661
|
-
};
|
|
662
|
-
websocket.addEventListener(key, listener);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
catch (error) {
|
|
666
|
-
console.error(error);
|
|
667
|
-
}
|
|
668
|
-
});
|
|
669
799
|
}
|
|
670
800
|
throw new TypeError("Invalid arguments.");
|
|
671
801
|
};
|
|
672
|
-
|
|
673
|
-
|
|
802
|
+
export let useWindow = (argument1, argument2 = {}) => {
|
|
803
|
+
let options = argument2;
|
|
804
|
+
let debounce = isObject(options) && isNumber(options.debounce) ? options.debounce : 0;
|
|
805
|
+
let throttle = isObject(options) && isNumber(options.throttle) ? options.throttle : 0;
|
|
674
806
|
if (isString(argument1)) {
|
|
675
807
|
let key = argument1;
|
|
676
|
-
return new
|
|
677
|
-
|
|
808
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
809
|
+
let timeOut = null;
|
|
810
|
+
let lastEmitTime = 0;
|
|
811
|
+
let index = 0n;
|
|
812
|
+
let until = new Promise(resolve => {
|
|
678
813
|
let listener = (event) => {
|
|
679
|
-
if (
|
|
680
|
-
|
|
814
|
+
if (debounce > 0) {
|
|
815
|
+
if (timeOut) {
|
|
816
|
+
clearTimeout(timeOut);
|
|
817
|
+
}
|
|
818
|
+
timeOut = setTimeout(() => {
|
|
819
|
+
if (interrupt(event, index)) {
|
|
820
|
+
window.removeEventListener(key, listener);
|
|
821
|
+
resolve();
|
|
822
|
+
return;
|
|
823
|
+
}
|
|
824
|
+
accept(event, index);
|
|
825
|
+
index++;
|
|
826
|
+
}, debounce);
|
|
827
|
+
return;
|
|
828
|
+
}
|
|
829
|
+
if (throttle > 0) {
|
|
830
|
+
let now = performance.now();
|
|
831
|
+
if (now - lastEmitTime < throttle) {
|
|
832
|
+
return;
|
|
833
|
+
}
|
|
834
|
+
lastEmitTime = now;
|
|
835
|
+
if (interrupt(event, index)) {
|
|
836
|
+
window.removeEventListener(key, listener);
|
|
837
|
+
resolve();
|
|
838
|
+
return;
|
|
839
|
+
}
|
|
840
|
+
accept(event, index);
|
|
841
|
+
index++;
|
|
842
|
+
return;
|
|
681
843
|
}
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
844
|
+
if (interrupt(event, index)) {
|
|
845
|
+
window.removeEventListener(key, listener);
|
|
846
|
+
resolve();
|
|
847
|
+
accept(event, -1n);
|
|
848
|
+
return;
|
|
685
849
|
}
|
|
850
|
+
accept(event, index);
|
|
851
|
+
index++;
|
|
686
852
|
};
|
|
687
853
|
window.addEventListener(key, listener);
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
console.error(error);
|
|
691
|
-
}
|
|
854
|
+
});
|
|
855
|
+
await until;
|
|
692
856
|
});
|
|
693
857
|
}
|
|
694
|
-
|
|
695
|
-
let keys = new Set(argument1);
|
|
696
|
-
return new
|
|
697
|
-
|
|
698
|
-
|
|
858
|
+
if (isIterable(argument1)) {
|
|
859
|
+
let keys = new Set(...argument1);
|
|
860
|
+
return new AsynchronousSemantic(async (accept, interrupt) => {
|
|
861
|
+
let lastEmitTime = 0;
|
|
862
|
+
let timeOut = null;
|
|
863
|
+
let index = 0n;
|
|
864
|
+
let activeCount = keys.size;
|
|
865
|
+
let until = new Promise(resolve => {
|
|
699
866
|
for (let key of keys) {
|
|
700
|
-
if (isString(key))
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
867
|
+
if (!isString(key))
|
|
868
|
+
continue;
|
|
869
|
+
let listener = (event) => {
|
|
870
|
+
if (debounce > 0) {
|
|
871
|
+
if (timeOut) {
|
|
872
|
+
clearTimeout(timeOut);
|
|
705
873
|
}
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
874
|
+
timeOut = setTimeout(() => handleEvent(event, key), debounce);
|
|
875
|
+
return;
|
|
876
|
+
}
|
|
877
|
+
if (throttle > 0) {
|
|
878
|
+
let now = performance.now();
|
|
879
|
+
if (now - lastEmitTime < throttle)
|
|
880
|
+
return;
|
|
881
|
+
lastEmitTime = now;
|
|
882
|
+
}
|
|
883
|
+
handleEvent(event, key);
|
|
884
|
+
};
|
|
885
|
+
let handleEvent = (event, currentKey) => {
|
|
886
|
+
if (interrupt(event, index)) {
|
|
887
|
+
window.removeEventListener(currentKey, listener);
|
|
888
|
+
if (--activeCount === 0) {
|
|
889
|
+
resolve();
|
|
709
890
|
}
|
|
710
|
-
|
|
891
|
+
return;
|
|
892
|
+
}
|
|
893
|
+
accept(event, index);
|
|
711
894
|
index++;
|
|
712
|
-
|
|
713
|
-
|
|
895
|
+
};
|
|
896
|
+
window.addEventListener(key, listener);
|
|
714
897
|
}
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
console.error(error);
|
|
718
|
-
}
|
|
898
|
+
});
|
|
899
|
+
await until;
|
|
719
900
|
});
|
|
720
901
|
}
|
|
721
902
|
throw new TypeError("Invalid arguments.");
|