X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fcircular-array.ts;h=511b699c8827a2a214efe63e2fce9dfabfcee73a;hb=e1e012cc5e191a56cf5ec4939b3906dfc1eb3edb;hp=40bd19ae0fc74742380979fe05712a5e962251c6;hpb=dde90273424a8c6dbfaddcc7e6a771623c521f2c;p=poolifier.git diff --git a/src/circular-array.ts b/src/circular-array.ts index 40bd19ae..511b699c 100644 --- a/src/circular-array.ts +++ b/src/circular-array.ts @@ -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 = 1024 /** * Array with a maximum length and shifting items when full. + * + * @typeParam T - Type of items. + * @internal */ export class CircularArray extends Array { public size: number @@ -51,18 +54,28 @@ export class CircularArray extends Array { } /** @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 { + 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( + 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 } public resize (size: number): void {