Commit | Line | Data |
---|---|---|
edfb206c JB |
1 | |
2 | export default class CircularArray<T> extends Array<T> { | |
3 | public size: number; | |
e795a787 | 4 | private readonly maximumCircularArraySize = 2000; |
edfb206c | 5 | |
53f53d65 | 6 | constructor(size?: number) { |
edfb206c | 7 | super(); |
e795a787 | 8 | this.size = size && size <= this.maximumCircularArraySize ? size : this.maximumCircularArraySize; |
edfb206c JB |
9 | } |
10 | ||
11 | push(...items: T[]): number { | |
b6633b4c JB |
12 | if (this.length + items.length > this.size) { |
13 | super.splice(0, (this.length + items.length) - this.size); | |
edfb206c JB |
14 | } |
15 | return super.push(...items); | |
16 | } | |
17 | ||
18 | unshift(...items: T[]): number { | |
b6633b4c JB |
19 | if (this.length + items.length > this.size) { |
20 | super.splice(this.size - items.length, (this.length + items.length) - this.size); | |
edfb206c JB |
21 | } |
22 | return super.unshift(...items); | |
23 | } | |
c70ff58d JB |
24 | |
25 | concat(...items: (T|ConcatArray<T>)[]): T[] { | |
26 | if (this.length + items.length > this.size) { | |
27 | super.splice(0, (this.length + items.length) - this.size); | |
28 | } | |
29 | return super.concat(items as T[]); | |
30 | } | |
31 | ||
32 | splice(start: number, deleteCount?: number, ...items: T[]): T[] { | |
33 | this.push(...items); | |
34 | return super.splice(start, deleteCount); | |
35 | } | |
edfb206c | 36 | } |