semantic-typescript 0.5.0 → 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.
Files changed (47) hide show
  1. package/dist/asynchronous/collector.d.ts +231 -0
  2. package/dist/asynchronous/collector.js +800 -0
  3. package/dist/asynchronous/semantic.d.ts +257 -0
  4. package/dist/asynchronous/semantic.js +1853 -0
  5. package/dist/factory.d.ts +110 -32
  6. package/dist/factory.js +582 -189
  7. package/dist/guard.d.ts +24 -27
  8. package/dist/guard.js +37 -43
  9. package/dist/hook.d.ts +11 -7
  10. package/dist/hook.js +74 -21
  11. package/dist/index.d.ts +2 -3
  12. package/dist/index.js +2 -3
  13. package/dist/optional.d.ts +5 -5
  14. package/dist/optional.js +14 -10
  15. package/dist/symbol.d.ts +19 -23
  16. package/dist/symbol.js +19 -23
  17. package/dist/synchronous/collector.d.ts +232 -0
  18. package/dist/{collector.js → synchronous/collector.js} +160 -170
  19. package/dist/{collectable.d.ts → synchronous/semantic.d.ts} +114 -71
  20. package/dist/{collectable.js → synchronous/semantic.js} +761 -294
  21. package/dist/utility.d.ts +8 -2
  22. package/dist/utility.js +1 -0
  23. package/package.json +1 -1
  24. package/readme.cn.md +158 -697
  25. package/readme.de.md +163 -432
  26. package/readme.es.md +163 -433
  27. package/readme.fr.md +162 -444
  28. package/readme.jp.md +162 -442
  29. package/readme.kr.md +161 -430
  30. package/readme.md +157 -799
  31. package/readme.ru.md +161 -426
  32. package/readme.tw.md +161 -436
  33. package/dist/collector.d.ts +0 -245
  34. package/dist/map.d.ts +0 -76
  35. package/dist/map.js +0 -253
  36. package/dist/node.d.ts +0 -182
  37. package/dist/node.js +0 -918
  38. package/dist/semantic.d.ts +0 -52
  39. package/dist/semantic.js +0 -504
  40. package/dist/set.d.ts +0 -19
  41. package/dist/set.js +0 -65
  42. package/dist/statistics.d.ts +0 -97
  43. package/dist/statistics.js +0 -483
  44. package/dist/tree.d.ts +0 -82
  45. package/dist/tree.js +0 -257
  46. package/dist/window.d.ts +0 -12
  47. package/dist/window.js +0 -72
package/dist/factory.js CHANGED
@@ -1,12 +1,15 @@
1
- import { isBigInt, isFunction, isIterable, isNumber, isObject, isPromise, isAsyncIterable, isWindow, isString, isDocument } from "./guard";
2
- import { useCompare, useTraverse } from "./hook";
3
- import { Semantic } from "./semantic";
1
+ import { AsynchronousSemantic } from "./asynchronous/semantic";
2
+ import { isBigInt, isFunction, isIterable, isNumber, isObject, isPromise, isAsyncIterable, isString, isHTMLElemet } from "./guard";
3
+ import { useCompare, useToBigInt, useToNumber, useTraverse } from "./hook";
4
+ import { Optional } from "./optional";
5
+ import { SynchronousSemantic } from "./synchronous/semantic";
4
6
  import { invalidate, validate } from "./utility";
5
- export let animationFrame = (period, delay = 0) => {
7
+ ;
8
+ export let useAnimationFrame = (period, delay = 0) => {
6
9
  if (period <= 0 || !Number.isFinite(period) || delay < 0 || !Number.isFinite(delay)) {
7
10
  throw new TypeError("Period must be positive finite number and delay must be non-negative finite number.");
8
11
  }
9
- return new Semantic((accept, interrupt) => {
12
+ return new SynchronousSemantic((accept, interrupt) => {
10
13
  try {
11
14
  let start = performance.now();
12
15
  let index = 0n;
@@ -26,14 +29,14 @@ export let animationFrame = (period, delay = 0) => {
26
29
  };
27
30
  }
28
31
  catch (error) {
29
- throw new Error("Uncaught error as creating animation frame semantic.");
32
+ console.error(error);
30
33
  }
31
34
  });
32
35
  };
33
36
  ;
34
- export let attribute = (target) => {
37
+ export let useAttribute = (target) => {
35
38
  if (isObject(target)) {
36
- return new Semantic((accept, interrupt) => {
39
+ return new SynchronousSemantic((accept, interrupt) => {
37
40
  try {
38
41
  let index = 0n;
39
42
  useTraverse(target, (key, value) => {
@@ -50,13 +53,14 @@ export let attribute = (target) => {
50
53
  });
51
54
  }
52
55
  catch (error) {
53
- throw new Error("Uncaught error as creating attribute semantic.");
56
+ console.error(error);
54
57
  }
55
58
  });
56
59
  }
57
60
  throw new TypeError("Target must be an object.");
58
61
  };
59
- export let blob = (blob, chunk = 64n * 1024n) => {
62
+ ;
63
+ export let useBlob = (blob, chunk = 64n * 1024n) => {
60
64
  let size = Number(chunk);
61
65
  if (size <= 0 || !Number.isSafeInteger(size)) {
62
66
  throw new RangeError("Chunk size must be a safe positive integer.");
@@ -64,7 +68,7 @@ export let blob = (blob, chunk = 64n * 1024n) => {
64
68
  if (invalidate(blob)) {
65
69
  throw new TypeError("Blob is invalid.");
66
70
  }
67
- return new Semantic((accept, interrupt) => {
71
+ return new SynchronousSemantic((accept, interrupt) => {
68
72
  try {
69
73
  let index = 0n;
70
74
  let stoppable = false;
@@ -122,174 +126,353 @@ export let blob = (blob, chunk = 64n * 1024n) => {
122
126
  })();
123
127
  }
124
128
  catch (error) {
125
- throw new Error("Uncaught error as creating blob semantic.");
129
+ console.error(error);
126
130
  }
127
131
  });
128
132
  };
129
- export let empty = () => {
130
- return new Semantic(() => { });
131
- };
132
133
  ;
133
- export let event = (argument1, argument2) => {
134
- if (isWindow(argument1)) {
135
- let target = argument1;
136
- if (isString(argument2)) {
137
- let key = argument2;
138
- return new Semantic((accept, interrupt) => {
139
- try {
140
- let index = 0n;
141
- let listener = (event) => {
142
- if (interrupt(event, index)) {
143
- target.removeEventListener(key, listener);
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 => {
146
+ let listener = (event) => {
147
+ if (debounce > 0) {
148
+ if (timeOut) {
149
+ clearTimeout(timeOut);
144
150
  }
145
- else {
151
+ timeOut = setTimeout(() => {
152
+ if (interrupt(event, index)) {
153
+ window.document.removeEventListener(key, listener);
154
+ resolve();
155
+ return;
156
+ }
146
157
  accept(event, index);
147
158
  index++;
159
+ }, debounce);
160
+ return;
161
+ }
162
+ if (throttle > 0) {
163
+ let now = performance.now();
164
+ if (now - lastEmitTime < throttle) {
165
+ return;
148
166
  }
149
- };
150
- target.addEventListener(key, listener);
151
- }
152
- catch (error) {
153
- throw new Error("Uncaught error as creating event semantic.");
154
- }
155
- });
156
- }
157
- if (isIterable(argument2)) {
158
- let keys = argument2;
159
- return new Semantic((accept, interrupt) => {
160
- try {
161
- let index = 0n;
162
- for (let key of keys) {
163
- if (isString(key)) {
164
- let listener = (event) => {
165
- if (interrupt(event, index)) {
166
- target.removeEventListener(key, listener);
167
- }
168
- else {
169
- accept(event, index);
170
- index++;
171
- }
172
- };
173
- target.addEventListener(key, listener);
167
+ lastEmitTime = now;
168
+ if (interrupt(event, index)) {
169
+ window.document.removeEventListener(key, listener);
170
+ resolve();
171
+ return;
174
172
  }
173
+ accept(event, index);
174
+ index++;
175
+ return;
175
176
  }
176
- }
177
- catch (error) {
178
- throw new Error("Uncaught error as creating event semantic.");
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++;
185
+ };
186
+ window.document.addEventListener(key, listener);
187
+ });
188
+ await until;
189
+ });
190
+ }
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 => {
199
+ for (let key of keys) {
200
+ if (!isString(key))
201
+ continue;
202
+ let listener = (event) => {
203
+ if (debounce > 0) {
204
+ if (timeOut) {
205
+ clearTimeout(timeOut);
206
+ }
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();
223
+ }
224
+ return;
225
+ }
226
+ accept(event, index);
227
+ index++;
228
+ };
229
+ window.document.addEventListener(key, listener);
179
230
  }
180
231
  });
181
- }
232
+ await until;
233
+ });
182
234
  }
183
- if (isDocument(argument1)) {
184
- let target = argument1;
235
+ throw new TypeError("Invalid arguments.");
236
+ };
237
+ ;
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;
185
249
  if (isString(argument2)) {
186
250
  let key = argument2;
187
- return new Semantic((accept, interrupt) => {
188
- try {
189
- let index = 0n;
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) => {
190
256
  let listener = (event) => {
191
- if (interrupt(event, index)) {
192
- target.removeEventListener(key, listener);
257
+ if (debounce > 0) {
258
+ if (timeOut)
259
+ clearTimeout(timeOut);
260
+ timeOut = setTimeout(() => handle(event), debounce);
261
+ return;
193
262
  }
194
- else {
195
- accept(event, index);
196
- index++;
263
+ if (throttle > 0) {
264
+ let now = performance.now();
265
+ if (now - lastEmit < throttle)
266
+ return;
267
+ lastEmit = now;
197
268
  }
269
+ handle(event);
198
270
  };
199
- target.addEventListener(key, listener);
200
- }
201
- catch (error) {
202
- throw new Error("Uncaught error as creating event semantic.");
203
- }
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;
204
285
  });
205
286
  }
206
287
  if (isIterable(argument2)) {
207
- let keys = argument2;
208
- return new Semantic((accept, interrupt) => {
209
- try {
210
- let index = 0n;
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) => {
211
293
  for (let key of keys) {
212
- if (isString(key)) {
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
+ }
312
+ if (isString(argument1)) {
313
+ let selector = argument1;
314
+ let elements = [...document.querySelectorAll(selector)];
315
+ if (isString(argument2)) {
316
+ let key = argument2;
317
+ return new AsynchronousSemantic(async (accept, interrupt) => {
318
+ let active = elements.length;
319
+ let index = 0n;
320
+ let until = new Promise((resolve) => {
321
+ for (let element of elements) {
322
+ if (validate(element)) {
213
323
  let listener = (event) => {
214
324
  if (interrupt(event, index)) {
215
- target.removeEventListener(key, listener);
325
+ element.removeEventListener(key, listener);
326
+ if (--active === 0) {
327
+ resolve();
328
+ }
329
+ return;
216
330
  }
217
- else {
331
+ accept(event, index);
332
+ index++;
333
+ };
334
+ element.addEventListener(key, listener);
335
+ }
336
+ }
337
+ });
338
+ await until;
339
+ });
340
+ }
341
+ if (isIterable(argument2)) {
342
+ let keys = new Set(argument2);
343
+ return new AsynchronousSemantic(async (accept, interrupt) => {
344
+ let active = elements.length * keys.size;
345
+ let index = 0n;
346
+ let until = new Promise((resolve) => {
347
+ for (let element of elements) {
348
+ for (let key of keys) {
349
+ if (validate(element) && isString(key)) {
350
+ let listener = (event) => {
351
+ if (interrupt(event, index)) {
352
+ element.removeEventListener(key, listener);
353
+ if (--active === 0) {
354
+ resolve();
355
+ }
356
+ return;
357
+ }
218
358
  accept(event, index);
219
359
  index++;
220
- }
221
- };
222
- target.addEventListener(key, listener);
360
+ };
361
+ element.addEventListener(key, listener);
362
+ }
223
363
  }
224
364
  }
225
- }
226
- catch (error) {
227
- throw new Error("Uncaught error as creating event semantic.");
228
- }
365
+ });
366
+ await until;
229
367
  });
230
368
  }
231
369
  }
232
370
  if (isIterable(argument1)) {
233
- let targets = argument1;
371
+ let elementsOrSelectors = new Set(argument1);
234
372
  if (isString(argument2)) {
235
373
  let key = argument2;
236
- return new Semantic((accept, interrupt) => {
237
- try {
238
- let index = 0n;
239
- for (let target of targets) {
240
- if (isObject(target) && isFunction(Reflect.get(target, "addEventListener"))) {
241
- let listener = (event) => {
242
- if (interrupt(event, index)) {
243
- target.removeEventListener(key, listener);
244
- }
245
- else {
246
- accept(event, index);
374
+ return new AsynchronousSemantic(async (accept, interrupt) => {
375
+ let active = elementsOrSelectors.size;
376
+ let until = new Promise((resolve) => {
377
+ for (let elementOrSelector of elementsOrSelectors) {
378
+ if (validate(elementOrSelector)) {
379
+ if (isHTMLElemet(elementOrSelector)) {
380
+ let element = elementOrSelector;
381
+ let listener = (event) => {
382
+ if (interrupt(event, 0n)) {
383
+ element.removeEventListener(key, listener);
384
+ if (--active === 0) {
385
+ resolve();
386
+ }
387
+ return;
388
+ }
389
+ accept(event, 0n);
390
+ };
391
+ element.addEventListener(key, listener);
392
+ }
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)) {
398
+ let listener = (event) => {
399
+ if (interrupt(event, 0n)) {
400
+ element.removeEventListener(key, listener);
401
+ if (--active === 0) {
402
+ resolve();
403
+ }
404
+ return;
405
+ }
406
+ accept(event, 0n);
407
+ };
408
+ element.addEventListener(key, listener);
409
+ }
247
410
  }
248
- };
249
- target.addEventListener(key, listener);
411
+ }
250
412
  }
251
413
  }
252
- }
253
- catch (error) {
254
- throw new Error("Uncaught error as creating event semantic.");
255
- }
414
+ });
415
+ await until;
256
416
  });
257
417
  }
258
418
  if (isIterable(argument2)) {
259
- let keys = argument2;
260
- return new Semantic((accept, interrupt) => {
261
- try {
262
- let index = 0n;
263
- for (let target of targets) {
264
- if (isObject(target) && isFunction(Reflect.get(target, "addEventListener"))) {
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)) {
425
+ let element = elementOrSelector;
265
426
  for (let key of keys) {
266
427
  if (isString(key)) {
267
428
  let listener = (event) => {
268
- if (interrupt(event, index)) {
269
- target.removeEventListener(key, listener);
429
+ if (interrupt(event, 0n)) {
430
+ element.removeEventListener(key, listener);
431
+ if (--active === 0) {
432
+ resolve();
433
+ }
434
+ return;
270
435
  }
271
- else {
272
- accept(event, index);
273
- index++;
436
+ accept(event, 0n);
437
+ };
438
+ element.addEventListener(key, listener);
439
+ }
440
+ }
441
+ }
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;
274
454
  }
455
+ accept(event, 0n);
275
456
  };
276
- target.addEventListener(key, listener);
457
+ element.addEventListener(key, listener);
277
458
  }
278
459
  }
279
460
  }
280
461
  }
281
- }
282
- catch (error) {
283
- throw new Error("Uncaught error as creating event semantic.");
284
- }
462
+ });
463
+ await until;
285
464
  });
286
465
  }
287
466
  }
288
467
  throw new TypeError("Invalid arguments.");
289
468
  };
290
- export let fill = (element, count) => {
469
+ export let useEmpty = () => {
470
+ return new SynchronousSemantic(() => { });
471
+ };
472
+ ;
473
+ export let useFill = (element, count) => {
291
474
  if (validate(element) && count > 0n) {
292
- return new Semantic((accept, interrupt) => {
475
+ return new SynchronousSemantic((accept, interrupt) => {
293
476
  try {
294
477
  for (let i = 0n; i < count; i++) {
295
478
  let item = isFunction(element) ? element() : element;
@@ -300,16 +483,16 @@ export let fill = (element, count) => {
300
483
  }
301
484
  }
302
485
  catch (error) {
303
- throw new Error("Uncaught error as creating fill semantic.");
486
+ console.error(error);
304
487
  }
305
488
  });
306
489
  }
307
490
  throw new TypeError("Invalid arguments.");
308
491
  };
309
492
  ;
310
- export let from = (iterable) => {
493
+ export let useFrom = (iterable) => {
311
494
  if (isIterable(iterable)) {
312
- return new Semantic((accept, interrupt) => {
495
+ return new SynchronousSemantic((accept, interrupt) => {
313
496
  try {
314
497
  let index = 0n;
315
498
  for (let element of iterable) {
@@ -321,12 +504,12 @@ export let from = (iterable) => {
321
504
  }
322
505
  }
323
506
  catch (error) {
324
- throw new Error("Uncaught error as creating from semantic.");
507
+ console.error(error);
325
508
  }
326
509
  });
327
510
  }
328
511
  else if (isAsyncIterable(iterable)) {
329
- return new Semantic(async (accept, interrupt) => {
512
+ return new SynchronousSemantic(async (accept, interrupt) => {
330
513
  try {
331
514
  let index = 0n;
332
515
  for await (let element of iterable) {
@@ -338,15 +521,16 @@ export let from = (iterable) => {
338
521
  }
339
522
  }
340
523
  catch (error) {
341
- throw new Error("Uncaught error as creating from semantic.");
524
+ console.error(error);
342
525
  }
343
526
  });
344
527
  }
345
528
  throw new TypeError("Invalid arguments");
346
529
  };
347
- export let generate = (supplier, interrupt) => {
530
+ ;
531
+ export let useGenerate = (supplier, interrupt) => {
348
532
  if (isFunction(supplier) && isFunction(interrupt)) {
349
- return new Semantic((accept, interrupt) => {
533
+ return new SynchronousSemantic((accept, interrupt) => {
350
534
  try {
351
535
  let index = 0n;
352
536
  while (true) {
@@ -359,15 +543,16 @@ export let generate = (supplier, interrupt) => {
359
543
  }
360
544
  }
361
545
  catch (error) {
362
- throw new Error("Uncaught error as creating generate semantic.");
546
+ console.error(error);
363
547
  }
364
548
  });
365
549
  }
366
550
  throw new TypeError("Invalid arguments");
367
551
  };
368
- export let interval = (period, delay = 0) => {
552
+ ;
553
+ export let useInterval = (period, delay = 0) => {
369
554
  if (period > 0 && delay >= 0) {
370
- return new Semantic((accept, interrupt) => {
555
+ return new SynchronousSemantic((accept, interrupt) => {
371
556
  try {
372
557
  if (delay > 0) {
373
558
  setTimeout(() => {
@@ -397,26 +582,26 @@ export let interval = (period, delay = 0) => {
397
582
  }
398
583
  }
399
584
  catch (error) {
400
- throw new Error("Uncaught error as creating interval semantic.");
585
+ console.error(error);
401
586
  }
402
587
  });
403
588
  }
404
589
  throw new TypeError("Invalid arguments.");
405
590
  };
406
- export let iterate = (generator) => {
591
+ export let useIterate = (generator) => {
407
592
  if (isFunction(generator)) {
408
593
  try {
409
- return new Semantic(generator);
594
+ return new SynchronousSemantic(generator);
410
595
  }
411
596
  catch (error) {
412
- throw new Error("Uncaught error as creating iterate semantic.");
597
+ console.error(error);
413
598
  }
414
599
  }
415
600
  throw new TypeError("Invalid arguments.");
416
601
  };
417
- export let promise = (promise) => {
602
+ export let usePromise = (promise) => {
418
603
  if (isPromise(promise)) {
419
- return new Semantic((accept, interrupt) => {
604
+ return new SynchronousSemantic((accept, interrupt) => {
420
605
  try {
421
606
  promise.then((value) => {
422
607
  if (interrupt(value, 0n)) {
@@ -428,7 +613,7 @@ export let promise = (promise) => {
428
613
  });
429
614
  }
430
615
  catch (error) {
431
- throw new Error("Uncaught error as creating promise semantic.");
616
+ console.error(error);
432
617
  }
433
618
  });
434
619
  }
@@ -436,77 +621,285 @@ export let promise = (promise) => {
436
621
  throw new TypeError("Invalid arguments.");
437
622
  }
438
623
  };
439
- export let range = (start, end, step = 1) => {
624
+ ;
625
+ export let useOf = (...target) => {
626
+ if (Array.isArray(target)) {
627
+ return new SynchronousSemantic((accept, interrupt) => {
628
+ try {
629
+ let index = 0n;
630
+ for (let element of target) {
631
+ if (interrupt(element, index)) {
632
+ break;
633
+ }
634
+ accept(element, index);
635
+ index++;
636
+ }
637
+ }
638
+ catch (error) {
639
+ console.error(error);
640
+ }
641
+ });
642
+ }
643
+ throw new TypeError("Invalid arguments.");
644
+ };
645
+ ;
646
+ export let useRange = (start, end, step = (isNumber(start) && isNumber(end) ? 1 : 1n)) => {
440
647
  if ((!isNumber(step) && !isBigInt(step)) || (isNumber(step) && useCompare(step, 0) === 0) || (isBigInt(step) && useCompare(step, 0n) === 0)) {
441
648
  throw new TypeError("Step must be numeric and cannot be zero.");
442
649
  }
443
650
  if (isNumber(start) && isNumber(end)) {
444
- let minimum = start, maximum = end, limit = Number(step);
445
- let condition = limit > 0 ? (i) => i < maximum : (i) => i > maximum;
446
- return new Semantic((accept, interrupt) => {
651
+ let trusted = useToNumber(step);
652
+ return new SynchronousSemantic((accept, interrupt) => {
653
+ try {
654
+ let index = 0n;
655
+ for (let i = start; i < end; i += trusted) {
656
+ if (interrupt(i, index)) {
657
+ break;
658
+ }
659
+ accept(i, index);
660
+ index++;
661
+ }
662
+ }
663
+ catch (error) {
664
+ console.error(error);
665
+ }
666
+ });
667
+ }
668
+ else if (isBigInt(start) && isBigInt(end)) {
669
+ let trusted = useToBigInt(step);
670
+ return new SynchronousSemantic((accept, interrupt) => {
447
671
  try {
448
- for (let i = minimum; condition(i); i += limit) {
449
- let value = i;
450
- if (interrupt(value, BigInt(i))) {
672
+ let index = 0n;
673
+ for (let i = start; i < end; i += trusted) {
674
+ if (interrupt(i, index)) {
451
675
  break;
452
676
  }
453
- accept(value, BigInt(i));
677
+ accept(i, index);
678
+ index++;
454
679
  }
455
680
  }
456
681
  catch (error) {
457
- throw new Error("Uncaught error as creating range semantic.");
682
+ console.error(error);
458
683
  }
459
684
  });
460
685
  }
461
686
  throw new TypeError("Invalid arguments.");
462
687
  };
463
- export let websocket = (websocket) => {
464
- if (invalidate(websocket)) {
465
- throw new TypeError("WebSocket is invalid.");
688
+ ;
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;
466
696
  }
467
- return new Semantic((accept, interrupt) => {
468
- try {
469
- let index = 0n;
470
- let stop = false;
471
- websocket.addEventListener("open", (event) => {
472
- if (stop || interrupt(event, index)) {
473
- stop = true;
474
- }
475
- else {
476
- accept(event, index);
477
- index++;
478
- }
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)) {
702
+ let websocket = argument1;
703
+ if (isString(argument2)) {
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 => {
710
+ let listener = (event) => {
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;
725
+ }
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;
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++;
749
+ };
750
+ websocket.addEventListener(key, listener);
751
+ });
752
+ await until;
479
753
  });
480
- websocket.addEventListener("message", (event) => {
481
- if (stop || interrupt(event, index)) {
482
- stop = true;
483
- }
484
- else {
485
- accept(event, index);
486
- index++;
487
- }
754
+ }
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 => {
763
+ for (let key of keys) {
764
+ if (!isString(key))
765
+ continue;
766
+ let listener = (event) => {
767
+ if (debounce > 0) {
768
+ if (timeOut) {
769
+ clearTimeout(timeOut);
770
+ }
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();
787
+ }
788
+ return;
789
+ }
790
+ accept(event, index);
791
+ index++;
792
+ };
793
+ websocket.addEventListener(key, listener);
794
+ }
795
+ });
796
+ await until;
488
797
  });
489
- websocket.addEventListener("error", (event) => {
490
- if (stop || interrupt(event, index)) {
491
- stop = true;
492
- }
493
- else {
798
+ }
799
+ }
800
+ throw new TypeError("Invalid arguments.");
801
+ };
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;
806
+ if (isString(argument1)) {
807
+ let key = argument1;
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 => {
813
+ let listener = (event) => {
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;
843
+ }
844
+ if (interrupt(event, index)) {
845
+ window.removeEventListener(key, listener);
846
+ resolve();
847
+ accept(event, -1n);
848
+ return;
849
+ }
494
850
  accept(event, index);
495
851
  index++;
496
- }
852
+ };
853
+ window.addEventListener(key, listener);
497
854
  });
498
- websocket.addEventListener("close", (event) => {
499
- if (stop || interrupt(event, index)) {
500
- stop = true;
501
- }
502
- else {
503
- accept(event, index);
504
- index++;
855
+ await until;
856
+ });
857
+ }
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 => {
866
+ for (let key of keys) {
867
+ if (!isString(key))
868
+ continue;
869
+ let listener = (event) => {
870
+ if (debounce > 0) {
871
+ if (timeOut) {
872
+ clearTimeout(timeOut);
873
+ }
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();
890
+ }
891
+ return;
892
+ }
893
+ accept(event, index);
894
+ index++;
895
+ };
896
+ window.addEventListener(key, listener);
505
897
  }
506
898
  });
507
- }
508
- catch (error) {
509
- throw new Error("Uncaught error as creating websocket semantic.");
510
- }
511
- });
899
+ await until;
900
+ });
901
+ }
902
+ throw new TypeError("Invalid arguments.");
512
903
  };
904
+ export let useNullable = (target) => Optional.ofNullable(target);
905
+ export let useNonNull = (target) => Optional.ofNonNull(target);