Merge branch 'master' into task-functions-properties
[poolifier.git] / src / circular-array.ts
index 654abb656da74bac380372cb39341aa9f2f831c5..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
@@ -17,7 +20,7 @@ export class CircularArray<T> extends Array<T> {
     }
   }
 
-  /** @inheritdoc */
+  /** @inheritDoc */
   public push (...items: T[]): number {
     const length = super.push(...items)
     if (length > this.size) {
@@ -26,7 +29,7 @@ export class CircularArray<T> extends Array<T> {
     return this.length
   }
 
-  /** @inheritdoc */
+  /** @inheritDoc */
   public unshift (...items: T[]): number {
     const length = super.unshift(...items)
     if (length > this.size) {
@@ -35,7 +38,7 @@ export class CircularArray<T> extends Array<T> {
     return this.length
   }
 
-  /** @inheritdoc */
+  /** @inheritDoc */
   public concat (...items: Array<T | ConcatArray<T>>): CircularArray<T> {
     const concatenatedCircularArray = super.concat(
       items as T[]
@@ -50,19 +53,29 @@ export class CircularArray<T> extends Array<T> {
     return concatenatedCircularArray
   }
 
-  /** @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)
+  /** @inheritDoc */
+  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 {