build(deps-dev): bump @types/node
[poolifier.git] / src / fixed-priority-queue.ts
index b50853dd596db8f63d0fd6182e18c38b523b4f1c..792f23d7e1347558cfdb55d30bc1436ad848ecdf 100644 (file)
@@ -23,19 +23,24 @@ export interface FixedPriorityQueueNode<T> {
 export class FixedPriorityQueue<T> {
   private start!: number
   private readonly nodeArray: Array<FixedPriorityQueueNode<T>>
+  /** The fixed priority queue capacity. */
   public readonly capacity: number
+  /** The fixed priority queue size. */
   public size!: number
-  public maxSize!: number
+  /** Whether to enable priority. */
+  public enablePriority: boolean
 
   /**
    * Constructs a fixed priority queue.
    *
    * @param size - Fixed priority queue size. @defaultValue defaultQueueSize
+   * @param enablePriority - Whether to enable priority. @defaultValue false
    * @returns FixedPriorityQueue.
    */
-  constructor (size: number = defaultQueueSize) {
+  constructor (size: number = defaultQueueSize, enablePriority = false) {
     this.checkSize(size)
     this.capacity = size
+    this.enablePriority = enablePriority
     this.nodeArray = new Array<FixedPriorityQueueNode<T>>(this.capacity)
     this.clear()
   }
@@ -64,27 +69,30 @@ export class FixedPriorityQueue<T> {
    * @param data - Data to enqueue.
    * @param priority - Priority of the data. Lower values have higher priority.
    * @returns The new size of the priority queue.
+   * @throws If the fixed priority queue is full.
    */
   public enqueue (data: T, priority?: number): number {
     if (this.full()) {
       throw new Error('Priority queue is full')
     }
     priority = priority ?? 0
-    let index = this.start
     let inserted = false
-    for (let i = 0; i < this.size; i++) {
-      if (this.nodeArray[index]?.priority > priority) {
-        this.nodeArray.splice(index, 0, { data, priority })
-        inserted = true
-        break
-      }
-      ++index
-      if (index === this.capacity) {
-        index = 0
+    if (this.enablePriority) {
+      let index = this.start
+      for (let i = 0; i < this.size; i++) {
+        if (this.nodeArray[index].priority > priority) {
+          this.nodeArray.splice(index, 0, { data, priority })
+          this.nodeArray.length !== this.capacity &&
+            (this.nodeArray.length = this.capacity)
+          inserted = true
+          break
+        }
+        ++index
+        if (index === this.capacity) {
+          index = 0
+        }
       }
     }
-    this.nodeArray.length !== this.capacity &&
-      (this.nodeArray.length = this.capacity)
     if (!inserted) {
       let index = this.start + this.size
       if (index >= this.capacity) {
@@ -92,7 +100,24 @@ export class FixedPriorityQueue<T> {
       }
       this.nodeArray[index] = { data, priority }
     }
-    return this.incrementSize()
+    return ++this.size
+  }
+
+  /**
+   * Gets data from the fixed priority queue.
+   *
+   * @param index - The index of the data to get.
+   * @returns The data at the index or `undefined` if the fixed priority queue is empty or the index is out of bounds.
+   */
+  public get (index: number): T | undefined {
+    if (this.empty() || index >= this.size) {
+      return undefined
+    }
+    index += this.start
+    if (index >= this.capacity) {
+      index -= this.capacity
+    }
+    return this.nodeArray[index].data
   }
 
   /**
@@ -119,7 +144,6 @@ export class FixedPriorityQueue<T> {
   public clear (): void {
     this.start = 0
     this.size = 0
-    this.maxSize = 0
   }
 
   /**
@@ -154,22 +178,9 @@ export class FixedPriorityQueue<T> {
   }
 
   /**
-   * Increments the size of the fixed priority queue.
-   *
-   * @returns The new size of the fixed priority queue.
-   */
-  private incrementSize (): number {
-    ++this.size
-    if (this.size > this.maxSize) {
-      this.maxSize = this.size
-    }
-    return this.size
-  }
-
-  /**
-   * Checks the size.
+   * Checks the queue size.
    *
-   * @param size - The size to check.
+   * @param size - Queue size.
    */
   private checkSize (size: number): void {
     if (!Number.isSafeInteger(size)) {