semantic-typescript 0.5.3 → 0.7.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,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;
@@ -28,14 +29,14 @@ export let useAnimationFrame = (period, delay = 0) => {
28
29
  };
29
30
  }
30
31
  catch (error) {
31
- console.error(error);
32
+ throw error;
32
33
  }
33
34
  });
34
35
  };
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) => {
@@ -52,7 +53,7 @@ export let useAttribute = (target) => {
52
53
  });
53
54
  }
54
55
  catch (error) {
55
- console.error(error);
56
+ throw error;
56
57
  }
57
58
  });
58
59
  }
@@ -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;
@@ -114,7 +115,7 @@ export let useBlob = (blob, chunk = 64n * 1024n) => {
114
115
  }
115
116
  }
116
117
  catch (error) {
117
- console.error(error);
118
+ throw error;
118
119
  }
119
120
  finally {
120
121
  if (stoppable) {
@@ -125,270 +126,387 @@ export let useBlob = (blob, chunk = 64n * 1024n) => {
125
126
  })();
126
127
  }
127
128
  catch (error) {
128
- console.error(error);
129
+ throw error;
129
130
  }
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 listeners = new Map();
199
+ let until = new Promise(resolve => {
160
200
  for (let key of keys) {
161
- if (isString(key)) {
162
- let listener = (event) => {
163
- if (interrupt(event, index)) {
164
- window.document.addEventListener(key, listener);
201
+ if (!isString(key))
202
+ continue;
203
+ let listener = (event) => {
204
+ if (debounce > 0) {
205
+ if (timeOut) {
206
+ clearTimeout(timeOut);
165
207
  }
166
- else {
167
- accept(event, index);
168
- index++;
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);
169
224
  }
170
- };
171
- window.document.addEventListener(key, listener);
172
- }
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);
173
236
  }
174
- }
175
- catch (error) {
176
- console.error(error);
177
- }
237
+ });
238
+ await until;
178
239
  });
179
240
  }
180
- throw new TypeError("Argument must be a string or an iterable of strings.");
241
+ throw new TypeError("Invalid arguments.");
181
242
  };
182
243
  ;
183
- export let useHTMLElement = (argument1, argument2) => {
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
+ }
184
323
  if (isString(argument1)) {
185
324
  let selector = argument1;
325
+ let elements = [...document.querySelectorAll(selector)];
186
326
  if (isString(argument2)) {
187
327
  let key = argument2;
188
- return new Semantic((accept, interrupt) => {
189
- try {
190
- let index = 0n;
191
- let elements = window.document.querySelectorAll(selector);
328
+ return new AsynchronousSemantic(async (accept, interrupt) => {
329
+ let index = 0n;
330
+ let listeners = new WeakMap();
331
+ let until = new Promise((resolve) => {
192
332
  for (let element of elements) {
193
333
  if (validate(element)) {
194
334
  let listener = (event) => {
195
335
  if (interrupt(event, index)) {
196
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;
197
346
  }
198
- else {
199
- accept(event, index);
200
- index++;
201
- }
347
+ accept(event, index);
348
+ index++;
202
349
  };
203
350
  element.addEventListener(key, listener);
351
+ let map = new Map() || new Map();
352
+ map.set(key, listener);
353
+ listeners.set(element, map);
204
354
  }
205
355
  }
206
- }
207
- catch (error) {
208
- console.error(error);
209
- }
356
+ });
357
+ await until;
210
358
  });
211
359
  }
212
360
  if (isIterable(argument2)) {
213
361
  let keys = new Set(argument2);
214
- return new Semantic((accept, interrupt) => {
215
- try {
216
- let index = 0n;
217
- let elements = window.document.querySelectorAll(selector);
362
+ return new AsynchronousSemantic(async (accept, interrupt) => {
363
+ let index = 0n;
364
+ let listeners = new Map();
365
+ let until = new Promise((resolve) => {
218
366
  for (let element of elements) {
219
367
  for (let key of keys) {
220
- if (isString(key)) {
368
+ if (validate(element) && isString(key)) {
221
369
  let listener = (event) => {
222
370
  if (interrupt(event, index)) {
223
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;
224
378
  }
225
- else {
226
- accept(event, index);
227
- index++;
228
- }
379
+ accept(event, index);
380
+ index++;
229
381
  };
230
382
  element.addEventListener(key, listener);
383
+ listeners.set(key, listener);
231
384
  }
232
385
  }
233
386
  }
234
- }
235
- catch (error) {
236
- console.error(error);
237
- }
387
+ });
388
+ await until;
238
389
  });
239
390
  }
240
391
  }
241
392
  if (isIterable(argument1)) {
242
- let elementsOrSelectors = argument1;
393
+ let elementsOrSelectors = new Set(argument1);
243
394
  if (isString(argument2)) {
244
395
  let key = argument2;
245
- return new Semantic((accept, interrupt) => {
246
- try {
247
- let index = 0n;
396
+ return new AsynchronousSemantic(async (accept, interrupt) => {
397
+ let listeners = new Map();
398
+ let until = new Promise((resolve) => {
248
399
  for (let elementOrSelector of elementsOrSelectors) {
249
- if (isString(elementOrSelector)) {
250
- let element = window.document.querySelector(elementOrSelector);
251
- if (validate(element)) {
400
+ if (validate(elementOrSelector)) {
401
+ if (isHTMLElemet(elementOrSelector)) {
402
+ let element = elementOrSelector;
252
403
  let listener = (event) => {
253
- if (interrupt(event, index)) {
404
+ if (interrupt(event, 0n)) {
254
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;
255
412
  }
256
- else {
257
- accept(event, index);
258
- index++;
259
- }
413
+ accept(event, 0n);
260
414
  };
261
415
  element.addEventListener(key, listener);
416
+ listeners.set(key, listener);
262
417
  }
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)) {
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)) {
295
423
  let listener = (event) => {
296
- if (interrupt(event, index)) {
424
+ if (interrupt(event, 0n)) {
297
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;
298
432
  }
299
- else {
300
- accept(event, index);
301
- index++;
302
- }
433
+ accept(event, 0n);
303
434
  };
304
435
  element.addEventListener(key, listener);
436
+ listeners.set(key, listener);
305
437
  }
306
438
  }
307
439
  }
308
440
  }
309
- else if (isHTMLElemet(elementOrSelector)) {
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)) {
310
453
  let element = elementOrSelector;
311
454
  for (let key of keys) {
312
455
  if (isString(key)) {
313
456
  let listener = (event) => {
314
- if (interrupt(event, index)) {
457
+ if (interrupt(event, 0n)) {
315
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;
316
465
  }
317
- else {
318
- accept(event, index);
319
- index++;
320
- }
466
+ accept(event, 0n);
321
467
  };
322
468
  element.addEventListener(key, listener);
469
+ listeners.set(key, listener);
323
470
  }
324
471
  }
325
472
  }
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++;
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);
371
492
  }
372
- };
373
- element.addEventListener(key, listener);
493
+ }
374
494
  }
375
495
  }
376
- }
377
- catch (error) {
378
- console.error(error);
379
- }
496
+ });
497
+ await until;
380
498
  });
381
499
  }
382
500
  }
383
501
  throw new TypeError("Invalid arguments.");
384
502
  };
385
503
  export let useEmpty = () => {
386
- return new Semantic(() => { });
504
+ return new SynchronousSemantic(() => { });
387
505
  };
388
506
  ;
389
507
  export let useFill = (element, count) => {
390
508
  if (validate(element) && count > 0n) {
391
- return new Semantic((accept, interrupt) => {
509
+ return new SynchronousSemantic((accept, interrupt) => {
392
510
  try {
393
511
  for (let i = 0n; i < count; i++) {
394
512
  let item = isFunction(element) ? element() : element;
@@ -399,7 +517,7 @@ export let useFill = (element, count) => {
399
517
  }
400
518
  }
401
519
  catch (error) {
402
- console.error(error);
520
+ throw error;
403
521
  }
404
522
  });
405
523
  }
@@ -408,7 +526,7 @@ export let useFill = (element, count) => {
408
526
  ;
409
527
  export let useFrom = (iterable) => {
410
528
  if (isIterable(iterable)) {
411
- return new Semantic((accept, interrupt) => {
529
+ return new SynchronousSemantic((accept, interrupt) => {
412
530
  try {
413
531
  let index = 0n;
414
532
  for (let element of iterable) {
@@ -420,12 +538,12 @@ export let useFrom = (iterable) => {
420
538
  }
421
539
  }
422
540
  catch (error) {
423
- console.error(error);
541
+ throw error;
424
542
  }
425
543
  });
426
544
  }
427
545
  else if (isAsyncIterable(iterable)) {
428
- return new Semantic(async (accept, interrupt) => {
546
+ return new SynchronousSemantic(async (accept, interrupt) => {
429
547
  try {
430
548
  let index = 0n;
431
549
  for await (let element of iterable) {
@@ -437,7 +555,7 @@ export let useFrom = (iterable) => {
437
555
  }
438
556
  }
439
557
  catch (error) {
440
- console.error(error);
558
+ throw error;
441
559
  }
442
560
  });
443
561
  }
@@ -446,7 +564,7 @@ export let useFrom = (iterable) => {
446
564
  ;
447
565
  export let useGenerate = (supplier, interrupt) => {
448
566
  if (isFunction(supplier) && isFunction(interrupt)) {
449
- return new Semantic((accept, interrupt) => {
567
+ return new SynchronousSemantic((accept, interrupt) => {
450
568
  try {
451
569
  let index = 0n;
452
570
  while (true) {
@@ -459,7 +577,7 @@ export let useGenerate = (supplier, interrupt) => {
459
577
  }
460
578
  }
461
579
  catch (error) {
462
- console.error(error);
580
+ throw error;
463
581
  }
464
582
  });
465
583
  }
@@ -468,7 +586,7 @@ export let useGenerate = (supplier, interrupt) => {
468
586
  ;
469
587
  export let useInterval = (period, delay = 0) => {
470
588
  if (period > 0 && delay >= 0) {
471
- return new Semantic((accept, interrupt) => {
589
+ return new SynchronousSemantic((accept, interrupt) => {
472
590
  try {
473
591
  if (delay > 0) {
474
592
  setTimeout(() => {
@@ -498,7 +616,7 @@ export let useInterval = (period, delay = 0) => {
498
616
  }
499
617
  }
500
618
  catch (error) {
501
- console.error(error);
619
+ throw error;
502
620
  }
503
621
  });
504
622
  }
@@ -507,17 +625,17 @@ export let useInterval = (period, delay = 0) => {
507
625
  export let useIterate = (generator) => {
508
626
  if (isFunction(generator)) {
509
627
  try {
510
- return new Semantic(generator);
628
+ return new SynchronousSemantic(generator);
511
629
  }
512
630
  catch (error) {
513
- console.error(error);
631
+ throw error;
514
632
  }
515
633
  }
516
634
  throw new TypeError("Invalid arguments.");
517
635
  };
518
636
  export let usePromise = (promise) => {
519
637
  if (isPromise(promise)) {
520
- return new Semantic((accept, interrupt) => {
638
+ return new SynchronousSemantic((accept, interrupt) => {
521
639
  try {
522
640
  promise.then((value) => {
523
641
  if (interrupt(value, 0n)) {
@@ -525,11 +643,11 @@ export let usePromise = (promise) => {
525
643
  }
526
644
  accept(value, 0n);
527
645
  }).catch((error) => {
528
- console.error(error);
646
+ throw error;
529
647
  });
530
648
  }
531
649
  catch (error) {
532
- console.error(error);
650
+ throw error;
533
651
  }
534
652
  });
535
653
  }
@@ -540,7 +658,7 @@ export let usePromise = (promise) => {
540
658
  ;
541
659
  export let useOf = (...target) => {
542
660
  if (Array.isArray(target)) {
543
- return new Semantic((accept, interrupt) => {
661
+ return new SynchronousSemantic((accept, interrupt) => {
544
662
  try {
545
663
  let index = 0n;
546
664
  for (let element of target) {
@@ -552,7 +670,7 @@ export let useOf = (...target) => {
552
670
  }
553
671
  }
554
672
  catch (error) {
555
- console.error(error);
673
+ throw error;
556
674
  }
557
675
  });
558
676
  }
@@ -565,7 +683,7 @@ export let useRange = (start, end, step = (isNumber(start) && isNumber(end) ? 1
565
683
  }
566
684
  if (isNumber(start) && isNumber(end)) {
567
685
  let trusted = useToNumber(step);
568
- return new Semantic((accept, interrupt) => {
686
+ return new SynchronousSemantic((accept, interrupt) => {
569
687
  try {
570
688
  let index = 0n;
571
689
  for (let i = start; i < end; i += trusted) {
@@ -577,13 +695,13 @@ export let useRange = (start, end, step = (isNumber(start) && isNumber(end) ? 1
577
695
  }
578
696
  }
579
697
  catch (error) {
580
- console.error(error);
698
+ throw error;
581
699
  }
582
700
  });
583
701
  }
584
702
  else if (isBigInt(start) && isBigInt(end)) {
585
703
  let trusted = useToBigInt(step);
586
- return new Semantic((accept, interrupt) => {
704
+ return new SynchronousSemantic((accept, interrupt) => {
587
705
  try {
588
706
  let index = 0n;
589
707
  for (let i = start; i < end; i += trusted) {
@@ -595,127 +713,266 @@ export let useRange = (start, end, step = (isNumber(start) && isNumber(end) ? 1
595
713
  }
596
714
  }
597
715
  catch (error) {
598
- console.error(error);
716
+ throw error;
599
717
  }
600
718
  });
601
719
  }
602
720
  throw new TypeError("Invalid arguments.");
603
721
  };
604
722
  ;
605
- export let useWebSocket = (argument1, argument2) => {
606
- if (isObject(argument1) && isFunction(Reflect.get(argument1, "addEventListener"))) {
723
+ export let useText = (argument1, argument2, argument3) => {
724
+ if (isString(argument1)) {
725
+ if (isNumber(argument2) || isBigInt(argument2)) {
726
+ let start = useToNumber(argument2);
727
+ if (isNumber(argument3) || isBigInt(argument3)) {
728
+ let end = useToNumber(argument3);
729
+ let characters = [...(argument1.substring(start, end))];
730
+ return new SynchronousSemantic((accept, interrupt) => {
731
+ let index = 0n;
732
+ for (let character of characters) {
733
+ if (interrupt(character, index)) {
734
+ break;
735
+ }
736
+ accept(character, index);
737
+ index++;
738
+ }
739
+ });
740
+ }
741
+ else {
742
+ let characters = [...(argument1.substring(start))];
743
+ return new SynchronousSemantic((accept, interrupt) => {
744
+ let index = 0n;
745
+ for (let character of characters) {
746
+ if (interrupt(character, index)) {
747
+ break;
748
+ }
749
+ accept(character, index);
750
+ index++;
751
+ }
752
+ });
753
+ }
754
+ }
755
+ }
756
+ throw new TypeError("Invalid arguments.");
757
+ };
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)) {
607
772
  let websocket = argument1;
608
773
  if (isString(argument2)) {
609
- let key = argument2;
610
- return new Semantic((accept, interrupt) => {
611
- try {
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 => {
612
780
  let listener = (event) => {
613
- if (interrupt(event, 0n)) {
614
- websocket.removeEventListener(key, listener);
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;
615
795
  }
616
- else {
617
- accept(event, 0n);
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;
618
816
  }
817
+ accept(event, index);
818
+ index++;
619
819
  };
620
820
  websocket.addEventListener(key, listener);
621
- }
622
- catch (error) {
623
- console.error(error);
624
- }
821
+ });
822
+ await until;
625
823
  });
626
824
  }
627
- else if (isIterable(argument2)) {
628
- let keys = argument2;
629
- return new Semantic((accept, interrupt) => {
630
- try {
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 => {
631
833
  for (let key of keys) {
632
- if (isString(key)) {
633
- let listener = (event) => {
634
- if (interrupt(event, 0n)) {
635
- websocket.removeEventListener(key, listener);
834
+ if (!isString(key))
835
+ continue;
836
+ let listener = (event) => {
837
+ if (debounce > 0) {
838
+ if (timeOut) {
839
+ clearTimeout(timeOut);
636
840
  }
637
- else {
638
- accept(event, 0n);
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();
639
857
  }
640
- };
641
- websocket.addEventListener(key, listener);
642
- }
858
+ return;
859
+ }
860
+ accept(event, index);
861
+ index++;
862
+ };
863
+ websocket.addEventListener(key, listener);
643
864
  }
644
- }
645
- catch (error) {
646
- console.error(error);
647
- }
865
+ });
866
+ await until;
648
867
  });
649
868
  }
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
869
  }
670
870
  throw new TypeError("Invalid arguments.");
671
871
  };
672
- ;
673
- export let useWindow = (argument1) => {
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;
674
876
  if (isString(argument1)) {
675
877
  let key = argument1;
676
- return new Semantic((accept, interrupt) => {
677
- try {
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 => {
678
883
  let listener = (event) => {
679
- if (interrupt(event, 0n)) {
680
- window.removeEventListener(key, listener);
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;
681
898
  }
682
- else {
683
- console.log(event.type, event);
684
- accept(event, 0n);
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;
685
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++;
686
922
  };
687
923
  window.addEventListener(key, listener);
688
- }
689
- catch (error) {
690
- console.error(error);
691
- }
924
+ });
925
+ await until;
692
926
  });
693
927
  }
694
- else if (isIterable(argument1)) {
695
- let keys = new Set(argument1);
696
- return new Semantic((accept, interrupt) => {
697
- try {
698
- let index = 0n;
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 => {
699
937
  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);
938
+ if (!isString(key))
939
+ continue;
940
+ let listener = (event) => {
941
+ if (debounce > 0) {
942
+ if (timeOut) {
943
+ clearTimeout(timeOut);
705
944
  }
706
- else {
707
- console.log("accept", performance.now());
708
- accept(event, index);
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);
709
961
  }
710
- };
962
+ listeners.clear();
963
+ if (--activeCount === 0) {
964
+ resolve();
965
+ }
966
+ return;
967
+ }
968
+ accept(event, index);
711
969
  index++;
712
- window.addEventListener(key, listener);
713
- }
970
+ };
971
+ window.addEventListener(key, listener);
972
+ listeners.set(key, listener);
714
973
  }
715
- }
716
- catch (error) {
717
- console.error(error);
718
- }
974
+ });
975
+ await until;
719
976
  });
720
977
  }
721
978
  throw new TypeError("Invalid arguments.");