Merge branch 'master' into task-functions-properties
[poolifier.git] / src / circular-array.ts
index 40bd19ae0fc74742380979fe05712a5e962251c6..2347327927d96f46063bb3f17d8e9060173a722c 100644 (file)
@@ -1,9 +1,12 @@
-// Copyright Jerome Benoit. 2021-2023. All Rights Reserved.
+// Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
 
-const DEFAULT_CIRCULAR_ARRAY_SIZE = 1024
+export const DEFAULT_CIRCULAR_ARRAY_SIZE = 385
 
 /**
  * Array with a maximum length and shifting items when full.
+ *
+ * @typeParam T - Type of items.
+ * @internal
  */
 export class CircularArray<T> extends Array<T> {
   public size: number
@@ -51,18 +54,28 @@ export class CircularArray<T> extends Array<T> {
   }
 
   /** @inheritDoc */
-  public splice (start: number, deleteCount?: number, ...items: T[]): T[] {
-    let itemsRemoved: T[]
-    if (arguments.length >= 3 && deleteCount !== undefined) {
-      itemsRemoved = super.splice(start, deleteCount)
-      // FIXME: that makes the items insert not in place
-      this.push(...items)
+  public splice (
+    start: number,
+    deleteCount?: number,
+    ...items: T[]
+  ): CircularArray<T> {
+    let itemsRemoved: T[] = []
+    if (arguments.length >= 3 && deleteCount != null) {
+      itemsRemoved = super.splice(start, deleteCount, ...items)
+      if (this.length > this.size) {
+        const itemsOverflowing = super.splice(0, this.length - this.size)
+        itemsRemoved = new CircularArray<T>(
+          itemsRemoved.length + itemsOverflowing.length,
+          ...itemsRemoved,
+          ...itemsOverflowing
+        )
+      }
     } else if (arguments.length === 2) {
       itemsRemoved = super.splice(start, deleteCount)
     } else {
       itemsRemoved = super.splice(start)
     }
-    return itemsRemoved
+    return itemsRemoved as CircularArray<T>
   }
 
   public resize (size: number): void {