1 // Copyright Jerome Benoit. 2021. All Rights Reserved.
3 export const DEFAULT_CIRCULAR_ARRAY_SIZE
= Number.MAX_SAFE_INTEGER
;
5 /** Array with a maximum length shifting items when full. */
6 export class CircularArray
<T
> extends Array<T
> {
9 constructor(size
: number = DEFAULT_CIRCULAR_ARRAY_SIZE
, ...items
: T
[]) {
13 if (arguments.length
> 1) {
18 public push(...items
: T
[]): number {
19 const length
= super.push(...items
);
20 if (length
> this.size
) {
21 super.splice(0, length
- this.size
);
26 public unshift(...items
: T
[]): number {
27 const length
= super.unshift(...items
);
28 if (length
> this.size
) {
29 super.splice(this.size
, items
.length
);
34 public concat(...items
: (T
| ConcatArray
<T
>)[]): CircularArray
<T
> {
35 const concatenatedCircularArray
= super.concat(items
as T
[]) as CircularArray
<T
>;
36 concatenatedCircularArray
.size
= this.size
;
37 if (concatenatedCircularArray
.length
> concatenatedCircularArray
.size
) {
38 concatenatedCircularArray
.splice(
40 concatenatedCircularArray
.length
- concatenatedCircularArray
.size
43 return concatenatedCircularArray
;
46 public splice(start
: number, deleteCount
?: number, ...items
: T
[]): T
[] {
47 let itemsRemoved
: T
[];
48 if (arguments.length
>= 3 && typeof deleteCount
!== 'undefined') {
49 itemsRemoved
= super.splice(start
, deleteCount
);
50 // FIXME: that makes the items insert not in place
52 } else if (arguments.length
=== 2) {
53 itemsRemoved
= super.splice(start
, deleteCount
);
55 itemsRemoved
= super.splice(start
);
60 public resize(size
: number): void {
64 } else if (size
< this.size
) {
65 for (let i
= size
; i
< this.size
; i
++) {
72 public empty(): boolean {
73 return this.length
=== 0;
76 public full(): boolean {
77 return this.length
=== this.size
;
80 private checkSize(size
: number) {
82 throw new RangeError('Invalid circular array size');