-// 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 shifting items when full.
+ * 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
}
}
+ /** @inheritDoc */
public push (...items: T[]): number {
const length = super.push(...items)
if (length > this.size) {
return this.length
}
+ /** @inheritDoc */
public unshift (...items: T[]): number {
const length = super.unshift(...items)
if (length > this.size) {
return this.length
}
+ /** @inheritDoc */
public concat (...items: Array<T | ConcatArray<T>>): CircularArray<T> {
const concatenatedCircularArray = super.concat(
items as T[]
return concatenatedCircularArray
}
- 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 {