fix: fix iteration in fixed queue if start > size
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 26 May 2024 14:46:04 +0000 (16:46 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 26 May 2024 14:46:04 +0000 (16:46 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/fixed-priority-queue.ts
tests/fixed-priority-queue.test.mjs

index fadaee750515b3de72bcc6c5a9f6cd70de0b68cd..1204cf8153c7a7e8b9b9f4e774f4528ba5e9bdab 100644 (file)
@@ -46,13 +46,18 @@ export class FixedPriorityQueue<T> {
     }
     priority = priority ?? 0
     const nodeArrayLength = this.nodeArray.length
+    let index = this.start
     let inserted = false
-    for (let index = this.start; index < nodeArrayLength; index++) {
+    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 === nodeArrayLength) {
+        index = 0
+      }
     }
     this.nodeArray.length !== nodeArrayLength &&
       (this.nodeArray.length = nodeArrayLength)
@@ -95,7 +100,8 @@ export class FixedPriorityQueue<T> {
    * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
    */
   [Symbol.iterator] (): Iterator<T> {
-    let i = this.start
+    let index = this.start
+    let i = 0
     return {
       next: () => {
         if (i >= this.size) {
@@ -104,8 +110,12 @@ export class FixedPriorityQueue<T> {
             done: true
           }
         }
-        const value = this.nodeArray[i].data
+        const value = this.nodeArray[index].data
+        index++
         i++
+        if (index === this.nodeArray.length) {
+          index = 0
+        }
         return {
           value,
           done: false
index 7a1506906817ee1c0c8022b5708777b69ad672f2..ef238aefe79c6ff104775b86f4010d83296aa8ae 100644 (file)
@@ -8,7 +8,7 @@
 // describe('Fixed priority queue test suite', () => {
 //   it('Verify constructor() behavior', () => {
 //     expect(() => new FixedPriorityQueue('')).toThrow(
-//       new TypeError('Invalid fixed priority queue size: '' is not an integer')
+//       new TypeError("Invalid fixed priority queue size: '' is not an integer")
 //     )
 //     expect(() => new FixedPriorityQueue(-1)).toThrow(
 //       new RangeError('Invalid fixed priority queue size: -1 < 0')