@yorozu/utils 0.3.1 → 0.5.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.
@@ -1,3 +1,3 @@
1
- export declare const empty: Uint8Array;
1
+ export declare const empty: Uint8Array<ArrayBuffer>;
2
2
  export declare function clone(buf: Uint8Array): Uint8Array;
3
3
  export declare function readNthBit(byte: number, bit: number): number;
@@ -1,9 +1,15 @@
1
1
  import { Deque } from '../structures';
2
2
  import { Deferred } from './deferred';
3
+ type WaitResult<T> = {
4
+ done: true;
5
+ } | {
6
+ done: false;
7
+ value: T;
8
+ };
3
9
  export declare class AsyncQueue<T> {
4
10
  readonly queue: Deque<T>;
5
11
  readonly maxSize: number | undefined;
6
- protected _consumerWaiters: Deque<Deferred<T | undefined>>;
12
+ protected _consumerWaiters: Deque<Deferred<WaitResult<T>>>;
7
13
  protected _producerWaiters: Deque<Deferred<void>>;
8
14
  protected _ended: boolean;
9
15
  constructor(from?: ArrayLike<T> | Deque<T>, maxSize?: number);
@@ -18,5 +24,7 @@ export declare class AsyncQueue<T> {
18
24
  next(): T | undefined;
19
25
  nextOrWait(): Promise<T | undefined>;
20
26
  [Symbol.asyncIterator](): AsyncIterableIterator<T>;
27
+ protected _waitForItem(): Promise<WaitResult<T>>;
21
28
  protected _wakeProducerIfNeeded(): void;
22
29
  }
30
+ export {};
@@ -0,0 +1,10 @@
1
+ export declare const fixedLengthExtraBits: Uint8Array;
2
+ export declare const fixedDistanceExtraBits: Uint8Array;
3
+ export declare const codeLengthOrder: Uint8Array;
4
+ export declare const lengthBase: Uint16Array;
5
+ export declare const lengthReverse: Int32Array;
6
+ export declare const distanceBase: Uint16Array;
7
+ export declare const distanceReverse: Int32Array;
8
+ export declare const reverseBits15: Uint16Array;
9
+ export declare const fixedLiteralLengths: Uint8Array;
10
+ export declare const fixedDistanceLengths: Uint8Array;
package/index.js CHANGED
@@ -44,9 +44,14 @@ function lastIndexOf(haystack, needle, start = haystack.length - 1) {
44
44
  return -1;
45
45
  }
46
46
  function indexOfArray(haystack, needle, start = 0) {
47
+ let length = haystack.length;
48
+ if (start < 0) {
49
+ start += length;
50
+ if (start < 0) start = 0;
51
+ }
47
52
  if (needle.length === 0) return start;
48
53
  if (needle.length === 1) return indexOf(haystack, needle[0], start);
49
- let max = haystack.length - needle.length;
54
+ let max = length - needle.length;
50
55
  for (let i = start; i <= max; i++) if (haystack[i] === needle[0]) {
51
56
  let j = 1;
52
57
  for (; j < needle.length; j++) if (haystack[i + j] !== needle[j]) break;
@@ -55,9 +60,14 @@ function indexOfArray(haystack, needle, start = 0) {
55
60
  return -1;
56
61
  }
57
62
  function lastIndexOfArray(haystack, needle, start = haystack.length - 1) {
63
+ let length = haystack.length;
64
+ if (start < 0) {
65
+ start += length;
66
+ if (start < 0) return -1;
67
+ } else if (start >= length) start = length - 1;
58
68
  if (needle.length === 0) return start;
59
69
  if (needle.length === 1) return lastIndexOf(haystack, needle[0], start);
60
- let maxStart = haystack.length - needle.length;
70
+ let maxStart = length - needle.length;
61
71
  let effectiveStart = start > maxStart ? maxStart : start;
62
72
  for (let i = effectiveStart; i >= 0; i--) {
63
73
  let j = 0;
@@ -1354,16 +1364,16 @@ var LruSet = class {
1354
1364
  var AsyncLock = class {
1355
1365
  _queue = new Deque();
1356
1366
  async acquire() {
1357
- let info;
1358
- while (info = this._queue.peekFront()) await info[0];
1359
1367
  let unlock;
1360
- const promise = new Promise((resolve) => {
1368
+ let promise = new Promise((resolve) => {
1361
1369
  unlock = resolve;
1362
1370
  });
1371
+ let prev = this._queue.peekBack();
1363
1372
  this._queue.pushBack([promise, unlock]);
1373
+ if (prev) await prev[0];
1364
1374
  }
1365
1375
  release() {
1366
- const front = this._queue.popFront();
1376
+ let front = this._queue.popFront();
1367
1377
  if (!front) throw new Error("Nothing to release.", { cause: this._queue });
1368
1378
  front[1]();
1369
1379
  }
@@ -1458,7 +1468,10 @@ var AsyncQueue = class {
1458
1468
  if (this._ended) throw new Error("Cannot enqueue after .end() has been called");
1459
1469
  while (true) {
1460
1470
  if (this._consumerWaiters.length > 0) {
1461
- this._consumerWaiters.popFront().resolve(item);
1471
+ this._consumerWaiters.popFront().resolve({
1472
+ done: false,
1473
+ value: item
1474
+ });
1462
1475
  return;
1463
1476
  }
1464
1477
  if (!this.isFull) {
@@ -1474,7 +1487,10 @@ var AsyncQueue = class {
1474
1487
  tryEnqueue(item) {
1475
1488
  if (this._ended || this.isFull) return false;
1476
1489
  if (this._consumerWaiters.length > 0) {
1477
- this._consumerWaiters.popFront().resolve(item);
1490
+ this._consumerWaiters.popFront().resolve({
1491
+ done: false,
1492
+ value: item
1493
+ });
1478
1494
  return true;
1479
1495
  }
1480
1496
  this.queue.pushBack(item);
@@ -1483,7 +1499,7 @@ var AsyncQueue = class {
1483
1499
  end() {
1484
1500
  if (this._ended) throw new Error(".end() has already been called.");
1485
1501
  this._ended = true;
1486
- for (let waiter of this._consumerWaiters) waiter.resolve(void 0);
1502
+ for (let waiter of this._consumerWaiters) waiter.resolve({ done: true });
1487
1503
  this._consumerWaiters.clear();
1488
1504
  let err = /* @__PURE__ */ new Error("Queue has been ended.");
1489
1505
  for (let waiter of this._producerWaiters) waiter.reject(err);
@@ -1505,27 +1521,40 @@ var AsyncQueue = class {
1505
1521
  return item;
1506
1522
  }
1507
1523
  if (this._ended) return;
1508
- let waiter = new Deferred();
1509
- this._consumerWaiters.pushBack(waiter);
1510
- return waiter.promise;
1524
+ let result = await this._waitForItem();
1525
+ if (result.done) return void 0;
1526
+ return result.value;
1511
1527
  }
1512
1528
  [Symbol.asyncIterator]() {
1513
1529
  let iterator = {
1514
1530
  [Symbol.asyncIterator]: () => iterator,
1515
1531
  next: async () => {
1516
- let item = await this.nextOrWait();
1517
- if (item === void 0) return {
1532
+ if (this.queue.length > 0) return {
1533
+ value: this.next(),
1534
+ done: false
1535
+ };
1536
+ if (this._ended) return {
1537
+ done: true,
1538
+ value: void 0
1539
+ };
1540
+ let result = await this._waitForItem();
1541
+ if (result.done) return {
1518
1542
  done: true,
1519
1543
  value: void 0
1520
1544
  };
1521
1545
  return {
1522
- value: item,
1546
+ value: result.value,
1523
1547
  done: false
1524
1548
  };
1525
1549
  }
1526
1550
  };
1527
1551
  return iterator;
1528
1552
  }
1553
+ _waitForItem() {
1554
+ let waiter = new Deferred();
1555
+ this._consumerWaiters.pushBack(waiter);
1556
+ return waiter.promise;
1557
+ }
1529
1558
  _wakeProducerIfNeeded() {
1530
1559
  if (this._producerWaiters.length > 0 && !this.isFull) this._producerWaiters.popFront().resolve();
1531
1560
  }
@@ -1784,7 +1813,7 @@ function sleep(ms, signal) {
1784
1813
  }
1785
1814
  let onAbort = () => {
1786
1815
  clearTimeout(timeoutId);
1787
- reject(signal.reason ?? new DOMException("The operation was aborted.", "AbortError"));
1816
+ reject(signal?.reason ?? new DOMException("The operation was aborted.", "AbortError"));
1788
1817
  };
1789
1818
  let timeoutId = setTimeout(() => {
1790
1819
  signal?.removeEventListener("abort", onAbort);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@yorozu/utils",
3
3
  "type": "module",
4
- "version": "0.3.1",
4
+ "version": "0.5.0",
5
5
  "description": "quality of life",
6
6
  "license": "MIT",
7
7
  "exports": {