fix: fix tasks usage accounting initializer
[poolifier.git] / src / queue.ts
index 7aad6d065ce6338129c70032b266ce5c6bcba600..dab9f04c2783f5a5aa039a3af894780f1b5c639f 100644 (file)
@@ -6,18 +6,15 @@
  * @typeParam T - Type of queue items.
  */
 export class Queue<T> {
-  private items: T[]
-  private offset: number
-  public size: number
-  public maxSize: number
+  private items!: T[]
+  private offset!: number
+  /** The size of the queue. */
+  public size!: number
+  /** The maximum size of the queue. */
+  public maxSize!: number
 
   public constructor () {
-    this.items = []
-    this.offset = 0
-    /** The size of the queue. */
-    this.size = 0
-    /** The maximum size of the queue. */
-    this.maxSize = 0
+    this.clear()
   }
 
   /**
@@ -54,7 +51,7 @@ export class Queue<T> {
   }
 
   /**
-   * Peek at the first item.
+   * Peeks at the first item.
    *
    * @returns The first item or `undefined` if the queue is empty.
    */
@@ -64,4 +61,42 @@ export class Queue<T> {
     }
     return this.items[this.offset]
   }
+
+  /**
+   * Clears the queue.
+   */
+  public clear (): void {
+    this.items = []
+    this.offset = 0
+    this.size = 0
+    this.maxSize = 0
+  }
+
+  /**
+   * Returns an iterator for the queue.
+   *
+   * @returns An iterator for the queue.
+   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
+   */
+  [Symbol.iterator] (): Iterator<T> {
+    const items = this.items
+    let i = this.offset
+
+    return {
+      next: () => {
+        if (i >= items.length) {
+          return {
+            value: undefined,
+            done: true
+          }
+        }
+        const value = items[i]
+        i++
+        return {
+          value,
+          done: false
+        }
+      }
+    }
+  }
 }