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.
Files changed (42) 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 +71 -37
  6. package/dist/factory.js +443 -262
  7. package/dist/guard.d.ts +24 -14
  8. package/dist/guard.js +73 -19
  9. package/dist/hook.d.ts +6 -6
  10. package/dist/hook.js +2 -2
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.js +2 -2
  13. package/dist/optional.d.ts +2 -2
  14. package/dist/symbol.d.ts +19 -10
  15. package/dist/symbol.js +19 -10
  16. package/dist/synchronous/collector.d.ts +232 -0
  17. package/dist/{collector.js → synchronous/collector.js} +160 -151
  18. package/dist/{semantic.d.ts → synchronous/semantic.d.ts} +111 -120
  19. package/dist/{semantic.js → synchronous/semantic.js} +299 -337
  20. package/dist/utility.d.ts +7 -1
  21. package/dist/utility.js +1 -0
  22. package/package.json +1 -1
  23. package/readme.cn.md +158 -697
  24. package/readme.de.md +163 -432
  25. package/readme.es.md +163 -433
  26. package/readme.fr.md +162 -444
  27. package/readme.jp.md +162 -442
  28. package/readme.kr.md +161 -430
  29. package/readme.md +157 -1009
  30. package/readme.ru.md +161 -426
  31. package/readme.tw.md +161 -436
  32. package/dist/collector.d.ts +0 -236
  33. package/dist/main.d.ts +0 -1
  34. package/dist/main.js +0 -4
  35. package/dist/map.d.ts +0 -76
  36. package/dist/map.js +0 -245
  37. package/dist/node.d.ts +0 -182
  38. package/dist/node.js +0 -918
  39. package/dist/set.d.ts +0 -19
  40. package/dist/set.js +0 -65
  41. package/dist/tree.d.ts +0 -82
  42. 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 { Semantic } from "./semantic";
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 Semantic((accept, interrupt) => {
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 Semantic((accept, interrupt) => {
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 Semantic((accept, interrupt) => {
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
- export let useDocument = (argument) => {
134
- if (isString(argument)) {
135
- let key = argument;
136
- return new Semantic((accept, interrupt) => {
137
- try {
138
- let index = 0n;
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 (interrupt(event, index)) {
141
- window.document.addEventListener(key, listener);
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
- else {
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
- catch (error) {
151
- console.error(error);
152
- }
187
+ });
188
+ await until;
153
189
  });
154
190
  }
155
- if (isIterable(argument)) {
156
- let keys = new Set(argument);
157
- return new Semantic((accept, interrupt) => {
158
- try {
159
- let index = 0n;
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
- let listener = (event) => {
163
- if (interrupt(event, index)) {
164
- window.document.addEventListener(key, listener);
200
+ if (!isString(key))
201
+ continue;
202
+ let listener = (event) => {
203
+ if (debounce > 0) {
204
+ if (timeOut) {
205
+ clearTimeout(timeOut);
165
206
  }
166
- else {
167
- accept(event, index);
168
- index++;
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
- window.document.addEventListener(key, listener);
172
- }
224
+ return;
225
+ }
226
+ accept(event, index);
227
+ index++;
228
+ };
229
+ window.document.addEventListener(key, listener);
173
230
  }
174
- }
175
- catch (error) {
176
- console.error(error);
177
- }
231
+ });
232
+ await until;
178
233
  });
179
234
  }
180
- throw new TypeError("Argument must be a string or an iterable of strings.");
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 Semantic((accept, interrupt) => {
189
- try {
190
- let index = 0n;
191
- let elements = window.document.querySelectorAll(selector);
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
- else {
199
- accept(event, index);
200
- index++;
201
- }
331
+ accept(event, index);
332
+ index++;
202
333
  };
203
334
  element.addEventListener(key, listener);
204
335
  }
205
336
  }
206
- }
207
- catch (error) {
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 Semantic((accept, interrupt) => {
215
- try {
216
- let index = 0n;
217
- let elements = window.document.querySelectorAll(selector);
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
- else {
226
- accept(event, index);
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
- catch (error) {
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 Semantic((accept, interrupt) => {
246
- try {
247
- let index = 0n;
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 (isString(elementOrSelector)) {
250
- let element = window.document.querySelector(elementOrSelector);
251
- if (validate(element)) {
378
+ if (validate(elementOrSelector)) {
379
+ if (isHTMLElemet(elementOrSelector)) {
380
+ let element = elementOrSelector;
252
381
  let listener = (event) => {
253
- if (interrupt(event, index)) {
382
+ if (interrupt(event, 0n)) {
254
383
  element.removeEventListener(key, listener);
384
+ if (--active === 0) {
385
+ resolve();
386
+ }
387
+ return;
255
388
  }
256
- else {
257
- accept(event, index);
258
- index++;
259
- }
389
+ accept(event, 0n);
260
390
  };
261
391
  element.addEventListener(key, listener);
262
392
  }
263
- }
264
- else if (isHTMLElemet(elementOrSelector)) {
265
- let element = elementOrSelector;
266
- let listener = (event) => {
267
- if (interrupt(event, index)) {
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, index)) {
399
+ if (interrupt(event, 0n)) {
297
400
  element.removeEventListener(key, listener);
401
+ if (--active === 0) {
402
+ resolve();
403
+ }
404
+ return;
298
405
  }
299
- else {
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
- else if (isHTMLElemet(elementOrSelector)) {
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, index)) {
429
+ if (interrupt(event, 0n)) {
315
430
  element.removeEventListener(key, listener);
431
+ if (--active === 0) {
432
+ resolve();
433
+ }
434
+ return;
316
435
  }
317
- else {
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
- catch (error) {
329
- console.error(error);
330
- }
331
- });
332
- }
333
- }
334
- if (isHTMLElemet(argument1)) {
335
- let element = argument1;
336
- if (isString(argument2)) {
337
- let key = argument2;
338
- return new Semantic((accept, interrupt) => {
339
- try {
340
- let index = 0n;
341
- let listener = (event) => {
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
- catch (error) {
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 Semantic(() => { });
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 Semantic((accept, interrupt) => {
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 Semantic((accept, interrupt) => {
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 Semantic(async (accept, interrupt) => {
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 Semantic((accept, interrupt) => {
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 Semantic((accept, interrupt) => {
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 Semantic(generator);
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 Semantic((accept, interrupt) => {
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 Semantic((accept, interrupt) => {
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 Semantic((accept, interrupt) => {
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 Semantic((accept, interrupt) => {
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
- export let useWebSocket = (argument1, argument2) => {
606
- if (isObject(argument1) && isFunction(Reflect.get(argument1, "addEventListener"))) {
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 = argument2;
610
- return new Semantic((accept, interrupt) => {
611
- try {
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 (interrupt(event, 0n)) {
614
- websocket.removeEventListener(key, listener);
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
- else {
617
- accept(event, 0n);
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
- catch (error) {
623
- console.error(error);
624
- }
751
+ });
752
+ await until;
625
753
  });
626
754
  }
627
- else if (isIterable(argument2)) {
628
- let keys = argument2;
629
- return new Semantic((accept, interrupt) => {
630
- try {
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
- let listener = (event) => {
634
- if (interrupt(event, 0n)) {
635
- websocket.removeEventListener(key, listener);
764
+ if (!isString(key))
765
+ continue;
766
+ let listener = (event) => {
767
+ if (debounce > 0) {
768
+ if (timeOut) {
769
+ clearTimeout(timeOut);
636
770
  }
637
- else {
638
- accept(event, 0n);
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
- websocket.addEventListener(key, listener);
642
- }
788
+ return;
789
+ }
790
+ accept(event, index);
791
+ index++;
792
+ };
793
+ websocket.addEventListener(key, listener);
643
794
  }
644
- }
645
- catch (error) {
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
- export let useWindow = (argument1) => {
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 Semantic((accept, interrupt) => {
677
- try {
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 (interrupt(event, 0n)) {
680
- window.removeEventListener(key, listener);
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
- else {
683
- console.log(event.type, event);
684
- accept(event, 0n);
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
- catch (error) {
690
- console.error(error);
691
- }
854
+ });
855
+ await until;
692
856
  });
693
857
  }
694
- else if (isIterable(argument1)) {
695
- let keys = new Set(argument1);
696
- return new Semantic((accept, interrupt) => {
697
- try {
698
- let index = 0n;
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
- let listener = function (event) {
702
- if (interrupt(event, index)) {
703
- console.log("Terminal", performance.now());
704
- window.removeEventListener(key, listener);
867
+ if (!isString(key))
868
+ continue;
869
+ let listener = (event) => {
870
+ if (debounce > 0) {
871
+ if (timeOut) {
872
+ clearTimeout(timeOut);
705
873
  }
706
- else {
707
- console.log("accept", performance.now());
708
- accept(event, index);
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
- window.addEventListener(key, listener);
713
- }
895
+ };
896
+ window.addEventListener(key, listener);
714
897
  }
715
- }
716
- catch (error) {
717
- console.error(error);
718
- }
898
+ });
899
+ await until;
719
900
  });
720
901
  }
721
902
  throw new TypeError("Invalid arguments.");