semantic-typescript 0.7.0 → 0.8.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/factory.js CHANGED
@@ -1,39 +1,9 @@
1
1
  import { AsynchronousSemantic } from "./asynchronous/semantic";
2
- import { isBigInt, isFunction, isIterable, isNumber, isObject, isPromise, isAsyncIterable, isString, isHTMLElemet } from "./guard";
2
+ import { isBigInt, isFunction, isIterable, isNumber, isObject, isPromise, isAsyncIterable, isString } from "./guard";
3
3
  import { useCompare, useToBigInt, useToNumber, useTraverse } from "./hook";
4
- import { Optional } from "./optional";
5
4
  import { SynchronousSemantic } from "./synchronous/semantic";
6
5
  import { invalidate, validate } from "./utility";
7
6
  ;
8
- export let useAnimationFrame = (period, delay = 0) => {
9
- if (period <= 0 || !Number.isFinite(period) || delay < 0 || !Number.isFinite(delay)) {
10
- throw new TypeError("Period must be positive finite number and delay must be non-negative finite number.");
11
- }
12
- return new SynchronousSemantic((accept, interrupt) => {
13
- try {
14
- let start = performance.now();
15
- let index = 0n;
16
- let animate = () => {
17
- if (performance.now() - start >= delay) {
18
- requestAnimationFrame(animate);
19
- }
20
- else if (performance.now() - start < period) {
21
- requestAnimationFrame(animate);
22
- }
23
- else {
24
- if (interrupt(start, index)) {
25
- return;
26
- }
27
- accept(performance.now(), index);
28
- }
29
- };
30
- }
31
- catch (error) {
32
- throw error;
33
- }
34
- });
35
- };
36
- ;
37
7
  export let useAttribute = (target) => {
38
8
  if (isObject(target)) {
39
9
  return new SynchronousSemantic((accept, interrupt) => {
@@ -130,376 +100,6 @@ export let useBlob = (blob, chunk = 64n * 1024n) => {
130
100
  }
131
101
  });
132
102
  };
133
- ;
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);
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;
161
- }
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
- }
173
- accept(event, index);
174
- index++;
175
- return;
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++;
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 listeners = new Map();
199
- let until = new Promise(resolve => {
200
- for (let key of keys) {
201
- if (!isString(key))
202
- continue;
203
- let listener = (event) => {
204
- if (debounce > 0) {
205
- if (timeOut) {
206
- clearTimeout(timeOut);
207
- }
208
- timeOut = setTimeout(() => handleEvent(event, key), debounce);
209
- return;
210
- }
211
- if (throttle > 0) {
212
- let now = performance.now();
213
- if (now - lastEmitTime < throttle)
214
- return;
215
- lastEmitTime = now;
216
- }
217
- handleEvent(event, key);
218
- };
219
- let handleEvent = (event, currentKey) => {
220
- if (interrupt(event, index)) {
221
- window.document.removeEventListener(currentKey, listener);
222
- for (let [k, l] of listeners) {
223
- window.document.removeEventListener(k, l);
224
- }
225
- listeners.clear();
226
- if (--activeCount === 0) {
227
- resolve();
228
- }
229
- return;
230
- }
231
- accept(event, index);
232
- index++;
233
- };
234
- window.document.addEventListener(key, listener);
235
- listeners.set(key, listener);
236
- }
237
- });
238
- await until;
239
- });
240
- }
241
- throw new TypeError("Invalid arguments.");
242
- };
243
- ;
244
- export let useHTMLElement = (argument1, argument2, argument3 = {}) => {
245
- let throttle = isObject(argument3) && isNumber(argument3.throttle) ? argument3.throttle : 0;
246
- let debounce = isObject(argument3) && isNumber(argument3.debounce) ? argument3.debounce : 0;
247
- if (debounce > 0 && throttle > 0) {
248
- throw new TypeError("throttle and debounce cannot be used together");
249
- }
250
- if (debounce < 0 || throttle < 0) {
251
- throw new TypeError("throttle/debounce must be non-negative");
252
- }
253
- if (isHTMLElemet(argument1)) {
254
- let element = argument1;
255
- if (isString(argument2)) {
256
- let key = argument2;
257
- return new AsynchronousSemantic(async (accept, interrupt) => {
258
- let timeOut = null;
259
- let lastEmit = 0;
260
- let index = 0n;
261
- let until = new Promise((resolve) => {
262
- let listener = (event) => {
263
- if (debounce > 0) {
264
- if (timeOut) {
265
- clearTimeout(timeOut);
266
- }
267
- timeOut = setTimeout(() => handle(event), debounce);
268
- return;
269
- }
270
- if (throttle > 0) {
271
- let now = performance.now();
272
- if (now - lastEmit < throttle)
273
- return;
274
- lastEmit = now;
275
- }
276
- handle(event);
277
- };
278
- let handle = (event) => {
279
- if (interrupt(event, index)) {
280
- element.removeEventListener(key, listener);
281
- if (timeOut) {
282
- clearTimeout(timeOut);
283
- }
284
- resolve();
285
- return;
286
- }
287
- accept(event, index);
288
- index++;
289
- };
290
- element.addEventListener(key, listener);
291
- });
292
- await until;
293
- });
294
- }
295
- if (isIterable(argument2)) {
296
- let keys = [...new Set(argument2)];
297
- return new AsynchronousSemantic(async (accept, interrupt) => {
298
- let index = 0n;
299
- let listeners = new Map();
300
- let until = new Promise((resolve) => {
301
- for (let key of keys) {
302
- let listener = (event) => {
303
- if (interrupt(event, index)) {
304
- element.removeEventListener(key, listener);
305
- for (let [k, l] of listeners) {
306
- element.removeEventListener(k, l);
307
- }
308
- listeners.clear();
309
- resolve();
310
- return;
311
- }
312
- accept(event, index);
313
- index++;
314
- };
315
- element.addEventListener(key, listener);
316
- listeners.set(key, listener);
317
- }
318
- });
319
- await until;
320
- });
321
- }
322
- }
323
- if (isString(argument1)) {
324
- let selector = argument1;
325
- let elements = [...document.querySelectorAll(selector)];
326
- if (isString(argument2)) {
327
- let key = argument2;
328
- return new AsynchronousSemantic(async (accept, interrupt) => {
329
- let index = 0n;
330
- let listeners = new WeakMap();
331
- let until = new Promise((resolve) => {
332
- for (let element of elements) {
333
- if (validate(element)) {
334
- let listener = (event) => {
335
- if (interrupt(event, index)) {
336
- element.removeEventListener(key, listener);
337
- let map = listeners.get(element);
338
- if (validate(map)) {
339
- for (let [k, l] of map) {
340
- element.removeEventListener(k, l);
341
- }
342
- map.clear();
343
- }
344
- resolve();
345
- return;
346
- }
347
- accept(event, index);
348
- index++;
349
- };
350
- element.addEventListener(key, listener);
351
- let map = new Map() || new Map();
352
- map.set(key, listener);
353
- listeners.set(element, map);
354
- }
355
- }
356
- });
357
- await until;
358
- });
359
- }
360
- if (isIterable(argument2)) {
361
- let keys = new Set(argument2);
362
- return new AsynchronousSemantic(async (accept, interrupt) => {
363
- let index = 0n;
364
- let listeners = new Map();
365
- let until = new Promise((resolve) => {
366
- for (let element of elements) {
367
- for (let key of keys) {
368
- if (validate(element) && isString(key)) {
369
- let listener = (event) => {
370
- if (interrupt(event, index)) {
371
- element.removeEventListener(key, listener);
372
- for (let [k, l] of listeners) {
373
- element.removeEventListener(k, l);
374
- }
375
- listeners.clear();
376
- resolve();
377
- return;
378
- }
379
- accept(event, index);
380
- index++;
381
- };
382
- element.addEventListener(key, listener);
383
- listeners.set(key, listener);
384
- }
385
- }
386
- }
387
- });
388
- await until;
389
- });
390
- }
391
- }
392
- if (isIterable(argument1)) {
393
- let elementsOrSelectors = new Set(argument1);
394
- if (isString(argument2)) {
395
- let key = argument2;
396
- return new AsynchronousSemantic(async (accept, interrupt) => {
397
- let listeners = new Map();
398
- let until = new Promise((resolve) => {
399
- for (let elementOrSelector of elementsOrSelectors) {
400
- if (validate(elementOrSelector)) {
401
- if (isHTMLElemet(elementOrSelector)) {
402
- let element = elementOrSelector;
403
- let listener = (event) => {
404
- if (interrupt(event, 0n)) {
405
- element.removeEventListener(key, listener);
406
- for (let [k, l] of listeners) {
407
- element.removeEventListener(k, l);
408
- }
409
- listeners.clear();
410
- resolve();
411
- return;
412
- }
413
- accept(event, 0n);
414
- };
415
- element.addEventListener(key, listener);
416
- listeners.set(key, listener);
417
- }
418
- else if (isString(elementOrSelector)) {
419
- let selector = elementOrSelector;
420
- let elements = [...document.querySelectorAll(selector)].filter((item) => isHTMLElemet(item));
421
- for (let element of elements) {
422
- if (validate(element)) {
423
- let listener = (event) => {
424
- if (interrupt(event, 0n)) {
425
- element.removeEventListener(key, listener);
426
- for (let [k, l] of listeners) {
427
- element.removeEventListener(k, l);
428
- }
429
- listeners.clear();
430
- resolve();
431
- return;
432
- }
433
- accept(event, 0n);
434
- };
435
- element.addEventListener(key, listener);
436
- listeners.set(key, listener);
437
- }
438
- }
439
- }
440
- }
441
- }
442
- });
443
- await until;
444
- });
445
- }
446
- if (isIterable(argument2)) {
447
- let keys = new Set(argument2);
448
- return new AsynchronousSemantic(async (accept, interrupt) => {
449
- let listeners = new Map();
450
- let until = new Promise((resolve) => {
451
- for (let elementOrSelector of elementsOrSelectors) {
452
- if (isHTMLElemet(elementOrSelector)) {
453
- let element = elementOrSelector;
454
- for (let key of keys) {
455
- if (isString(key)) {
456
- let listener = (event) => {
457
- if (interrupt(event, 0n)) {
458
- element.removeEventListener(key, listener);
459
- for (let [k, l] of listeners) {
460
- element.removeEventListener(k, l);
461
- }
462
- listeners.clear();
463
- resolve();
464
- return;
465
- }
466
- accept(event, 0n);
467
- };
468
- element.addEventListener(key, listener);
469
- listeners.set(key, listener);
470
- }
471
- }
472
- }
473
- else if (isString(elementOrSelector)) {
474
- let selector = elementOrSelector;
475
- let elements = [...document.querySelectorAll(selector)].filter((item) => isHTMLElemet(item));
476
- for (let element of elements) {
477
- for (let key of keys) {
478
- let listener = (event) => {
479
- if (interrupt(event, 0n)) {
480
- element.removeEventListener(key, listener);
481
- for (let [k, l] of listeners) {
482
- element.removeEventListener(k, l);
483
- }
484
- listeners.clear();
485
- resolve();
486
- return;
487
- }
488
- accept(event, 0n);
489
- };
490
- element.addEventListener(key, listener);
491
- listeners.set(key, listener);
492
- }
493
- }
494
- }
495
- }
496
- });
497
- await until;
498
- });
499
- }
500
- }
501
- throw new TypeError("Invalid arguments.");
502
- };
503
103
  export let useEmpty = () => {
504
104
  return new SynchronousSemantic(() => { });
505
105
  };
@@ -622,38 +222,159 @@ export let useInterval = (period, delay = 0) => {
622
222
  }
623
223
  throw new TypeError("Invalid arguments.");
624
224
  };
625
- export let useIterate = (generator) => {
626
- if (isFunction(generator)) {
627
- try {
628
- return new SynchronousSemantic(generator);
629
- }
630
- catch (error) {
631
- throw error;
632
- }
225
+ ;
226
+ export let useIterate = ((iterable) => {
227
+ if (isIterable(iterable)) {
228
+ return new SynchronousSemantic((accept, interrupt) => {
229
+ try {
230
+ let index = 0n;
231
+ for (let element of iterable) {
232
+ if (interrupt(element, index)) {
233
+ break;
234
+ }
235
+ accept(element, index);
236
+ index++;
237
+ }
238
+ }
239
+ catch (error) {
240
+ throw error;
241
+ }
242
+ });
243
+ }
244
+ if (isAsyncIterable(iterable)) {
245
+ return new AsynchronousSemantic(async (accept, interrupt) => {
246
+ return await new Promise(async (resolve, reject) => {
247
+ try {
248
+ let index = 0n;
249
+ for await (let element of iterable) {
250
+ if (interrupt(element, index)) {
251
+ break;
252
+ }
253
+ accept(element, index);
254
+ break;
255
+ }
256
+ resolve();
257
+ }
258
+ catch (error) {
259
+ reject(error);
260
+ }
261
+ });
262
+ });
633
263
  }
634
264
  throw new TypeError("Invalid arguments.");
635
- };
265
+ });
266
+ ;
636
267
  export let usePromise = (promise) => {
637
268
  if (isPromise(promise)) {
638
- return new SynchronousSemantic((accept, interrupt) => {
639
- try {
269
+ return new AsynchronousSemantic(async (accept, interrupt) => {
270
+ return new Promise(async (resolve, reject) => {
640
271
  promise.then((value) => {
641
272
  if (interrupt(value, 0n)) {
642
- return;
273
+ reject(new Error("Promise was interrupted."));
274
+ }
275
+ else {
276
+ accept(value, 0n);
277
+ resolve();
643
278
  }
644
- accept(value, 0n);
645
- }).catch((error) => {
646
- throw error;
647
279
  });
648
- }
649
- catch (error) {
650
- throw error;
651
- }
280
+ });
652
281
  });
653
282
  }
654
- else {
655
- throw new TypeError("Invalid arguments.");
283
+ throw new TypeError("Invalid arguments.");
284
+ };
285
+ ;
286
+ ;
287
+ export let useSubscription = (argument1, argument2, argument3) => {
288
+ if (isObject(argument1) && isFunction(argument2)) {
289
+ let target = argument1;
290
+ try {
291
+ let subscriber = argument2();
292
+ if (isString(argument3)) {
293
+ let subscription = argument3;
294
+ return new AsynchronousSemantic(async (accept, interrupt) => {
295
+ try {
296
+ subscriber.mount(target);
297
+ let index = 0n;
298
+ let unsubscriptions = new Map();
299
+ return new Promise(async (resolve, reject) => {
300
+ try {
301
+ let handler = (event) => {
302
+ if (interrupt(event, index)) {
303
+ for (let [unsubscriptionKey, unsubscriptionValue] of unsubscriptions) {
304
+ subscriber.unsubscribe(unsubscriptionKey, unsubscriptionValue);
305
+ }
306
+ subscriber.unmount();
307
+ resolve();
308
+ }
309
+ else {
310
+ accept(event, index);
311
+ index++;
312
+ }
313
+ };
314
+ subscriber.subscribe(subscription, handler);
315
+ unsubscriptions.set(subscription, handler);
316
+ }
317
+ catch (error) {
318
+ for (let [unsubscriptionKey, unsubscriptionValue] of unsubscriptions) {
319
+ subscriber.unsubscribe(unsubscriptionKey, unsubscriptionValue);
320
+ }
321
+ subscriber.unmount();
322
+ reject(error);
323
+ }
324
+ });
325
+ }
326
+ catch (error) {
327
+ throw error;
328
+ }
329
+ });
330
+ }
331
+ if (isIterable(argument3)) {
332
+ let subscriptions = argument3;
333
+ return new AsynchronousSemantic(async (accept, interrupt) => {
334
+ try {
335
+ subscriber.mount(target);
336
+ let index = 0n;
337
+ let unsubscriptions = new Map();
338
+ return new Promise(async (resolve, reject) => {
339
+ try {
340
+ for (let subscription of subscriptions) {
341
+ let handler = (event) => {
342
+ if (interrupt(event, index)) {
343
+ for (let [unsubscriptionKey, unsubscriptionValue] of unsubscriptions) {
344
+ subscriber.unsubscribe(unsubscriptionKey, unsubscriptionValue);
345
+ }
346
+ subscriber.unmount();
347
+ resolve();
348
+ }
349
+ else {
350
+ accept(event, index);
351
+ index++;
352
+ }
353
+ };
354
+ subscriber.subscribe(subscription, handler);
355
+ unsubscriptions.set(subscription, handler);
356
+ }
357
+ }
358
+ catch (error) {
359
+ for (let [unsubscriptionKey, unsubscriptionValue] of unsubscriptions) {
360
+ subscriber.unsubscribe(unsubscriptionKey, unsubscriptionValue);
361
+ }
362
+ subscriber.unmount();
363
+ reject(error);
364
+ }
365
+ });
366
+ }
367
+ catch (error) {
368
+ throw error;
369
+ }
370
+ });
371
+ }
372
+ }
373
+ catch (error) {
374
+ throw error;
375
+ }
656
376
  }
377
+ throw new TypeError("Invalid arguments.");
657
378
  };
658
379
  ;
659
380
  export let useOf = (...target) => {
@@ -722,11 +443,27 @@ export let useRange = (start, end, step = (isNumber(start) && isNumber(end) ? 1
722
443
  ;
723
444
  export let useText = (argument1, argument2, argument3) => {
724
445
  if (isString(argument1)) {
446
+ let text = argument1;
447
+ if (isString(argument2)) {
448
+ let delimeter = argument2;
449
+ return new SynchronousSemantic((accept, interrupt) => {
450
+ if (text.length > 0 && delimeter.length > 0) {
451
+ let splited = text.split(delimeter);
452
+ let index = 0n;
453
+ for (let split of splited) {
454
+ if (interrupt(split, index)) {
455
+ break;
456
+ }
457
+ accept(split, index);
458
+ }
459
+ }
460
+ });
461
+ }
725
462
  if (isNumber(argument2) || isBigInt(argument2)) {
726
463
  let start = useToNumber(argument2);
727
464
  if (isNumber(argument3) || isBigInt(argument3)) {
728
465
  let end = useToNumber(argument3);
729
- let characters = [...(argument1.substring(start, end))];
466
+ let characters = Array.from(argument1.substring(start, end));
730
467
  return new SynchronousSemantic((accept, interrupt) => {
731
468
  let index = 0n;
732
469
  for (let character of characters) {
@@ -739,7 +476,7 @@ export let useText = (argument1, argument2, argument3) => {
739
476
  });
740
477
  }
741
478
  else {
742
- let characters = [...(argument1.substring(start))];
479
+ let characters = Array.from(argument1.substring(start));
743
480
  return new SynchronousSemantic((accept, interrupt) => {
744
481
  let index = 0n;
745
482
  for (let character of characters) {
@@ -755,227 +492,3 @@ export let useText = (argument1, argument2, argument3) => {
755
492
  }
756
493
  throw new TypeError("Invalid arguments.");
757
494
  };
758
- ;
759
- ;
760
- export let useWebSocket = (argument1, argument2, argument3) => {
761
- let debounce = 0;
762
- let throttle = 0;
763
- if (isObject(argument2)) {
764
- debounce = Reflect.has(argument2, "debounce") ? Reflect.get(argument2, "debounce") : 0;
765
- throttle = Reflect.has(argument2, "throttle") ? Reflect.get(argument2, "throttle") : 0;
766
- }
767
- else {
768
- debounce = validate(argument3) && isNumber(argument3.debounce) ? argument3.debounce : 0;
769
- throttle = validate(argument3) && isNumber(argument3.throttle) ? argument3.throttle : 0;
770
- }
771
- if (validate(argument1)) {
772
- let websocket = argument1;
773
- if (isString(argument2)) {
774
- let key = argument1;
775
- return new AsynchronousSemantic(async (accept, interrupt) => {
776
- let timeOut = null;
777
- let lastEmitTime = 0;
778
- let index = 0n;
779
- let until = new Promise(resolve => {
780
- let listener = (event) => {
781
- if (debounce > 0) {
782
- if (timeOut) {
783
- clearTimeout(timeOut);
784
- }
785
- timeOut = setTimeout(() => {
786
- if (interrupt(event, index)) {
787
- websocket.removeEventListener(key, listener);
788
- resolve();
789
- return;
790
- }
791
- accept(event, index);
792
- index++;
793
- }, debounce);
794
- return;
795
- }
796
- if (throttle > 0) {
797
- let now = performance.now();
798
- if (now - lastEmitTime < throttle) {
799
- return;
800
- }
801
- lastEmitTime = now;
802
- if (interrupt(event, index)) {
803
- websocket.removeEventListener(key, listener);
804
- resolve();
805
- return;
806
- }
807
- accept(event, index);
808
- index++;
809
- return;
810
- }
811
- if (interrupt(event, index)) {
812
- websocket.removeEventListener(key, listener);
813
- resolve();
814
- accept(event, -1n);
815
- return;
816
- }
817
- accept(event, index);
818
- index++;
819
- };
820
- websocket.addEventListener(key, listener);
821
- });
822
- await until;
823
- });
824
- }
825
- if (isIterable(argument2)) {
826
- let keys = new Set(...argument1);
827
- return new AsynchronousSemantic(async (accept, interrupt) => {
828
- let lastEmitTime = 0;
829
- let timeOut = null;
830
- let index = 0n;
831
- let activeCount = keys.size;
832
- let until = new Promise(resolve => {
833
- for (let key of keys) {
834
- if (!isString(key))
835
- continue;
836
- let listener = (event) => {
837
- if (debounce > 0) {
838
- if (timeOut) {
839
- clearTimeout(timeOut);
840
- }
841
- timeOut = setTimeout(() => handleEvent(event, key), debounce);
842
- return;
843
- }
844
- if (throttle > 0) {
845
- let now = performance.now();
846
- if (now - lastEmitTime < throttle)
847
- return;
848
- lastEmitTime = now;
849
- }
850
- handleEvent(event, key);
851
- };
852
- let handleEvent = (event, currentKey) => {
853
- if (interrupt(event, index)) {
854
- websocket.removeEventListener(currentKey, listener);
855
- if (--activeCount === 0) {
856
- resolve();
857
- }
858
- return;
859
- }
860
- accept(event, index);
861
- index++;
862
- };
863
- websocket.addEventListener(key, listener);
864
- }
865
- });
866
- await until;
867
- });
868
- }
869
- }
870
- throw new TypeError("Invalid arguments.");
871
- };
872
- export let useWindow = (argument1, argument2 = {}) => {
873
- let options = argument2;
874
- let debounce = isObject(options) && isNumber(options.debounce) ? options.debounce : 0;
875
- let throttle = isObject(options) && isNumber(options.throttle) ? options.throttle : 0;
876
- if (isString(argument1)) {
877
- let key = argument1;
878
- return new AsynchronousSemantic(async (accept, interrupt) => {
879
- let timeOut = null;
880
- let lastEmitTime = 0;
881
- let index = 0n;
882
- let until = new Promise(resolve => {
883
- let listener = (event) => {
884
- if (debounce > 0) {
885
- if (timeOut) {
886
- clearTimeout(timeOut);
887
- }
888
- timeOut = setTimeout(() => {
889
- if (interrupt(event, index)) {
890
- window.removeEventListener(key, listener);
891
- resolve();
892
- return;
893
- }
894
- accept(event, index);
895
- index++;
896
- }, debounce);
897
- return;
898
- }
899
- if (throttle > 0) {
900
- let now = performance.now();
901
- if (now - lastEmitTime < throttle) {
902
- return;
903
- }
904
- lastEmitTime = now;
905
- if (interrupt(event, index)) {
906
- window.removeEventListener(key, listener);
907
- resolve();
908
- return;
909
- }
910
- accept(event, index);
911
- index++;
912
- return;
913
- }
914
- if (interrupt(event, index)) {
915
- window.removeEventListener(key, listener);
916
- resolve();
917
- accept(event, -1n);
918
- return;
919
- }
920
- accept(event, index);
921
- index++;
922
- };
923
- window.addEventListener(key, listener);
924
- });
925
- await until;
926
- });
927
- }
928
- if (isIterable(argument1)) {
929
- let keys = new Set(...argument1);
930
- return new AsynchronousSemantic(async (accept, interrupt) => {
931
- let lastEmitTime = 0;
932
- let timeOut = null;
933
- let index = 0n;
934
- let activeCount = keys.size;
935
- let listeners = new Map();
936
- let until = new Promise(resolve => {
937
- for (let key of keys) {
938
- if (!isString(key))
939
- continue;
940
- let listener = (event) => {
941
- if (debounce > 0) {
942
- if (timeOut) {
943
- clearTimeout(timeOut);
944
- }
945
- timeOut = setTimeout(() => handleEvent(event, key), debounce);
946
- return;
947
- }
948
- if (throttle > 0) {
949
- let now = performance.now();
950
- if (now - lastEmitTime < throttle)
951
- return;
952
- lastEmitTime = now;
953
- }
954
- handleEvent(event, key);
955
- };
956
- let handleEvent = (event, currentKey) => {
957
- if (interrupt(event, index)) {
958
- window.removeEventListener(currentKey, listener);
959
- for (let [k, l] of listeners) {
960
- window.removeEventListener(k, l);
961
- }
962
- listeners.clear();
963
- if (--activeCount === 0) {
964
- resolve();
965
- }
966
- return;
967
- }
968
- accept(event, index);
969
- index++;
970
- };
971
- window.addEventListener(key, listener);
972
- listeners.set(key, listener);
973
- }
974
- });
975
- await until;
976
- });
977
- }
978
- throw new TypeError("Invalid arguments.");
979
- };
980
- export let useNullable = (target) => Optional.ofNullable(target);
981
- export let useNonNull = (target) => Optional.ofNonNull(target);