4 export const defaultBufferSize
= 2048
7 * Circular buffer designed for positive numbers.
10 export class CircularBuffer
{
11 private readIdx
: number
12 private writeIdx
: number
13 private readonly items
: Float32Array
14 private readonly maxArrayIdx
: number
18 * @param size - Buffer size. @defaultValue defaultBufferSize
19 * @returns CircularBuffer.
21 constructor (size
: number = defaultBufferSize
) {
25 this.maxArrayIdx
= size
- 1
27 this.items
= new Float32Array(size
).fill(-1)
31 * Checks whether the buffer is empty.
32 * @returns Whether the buffer is empty.
34 public empty (): boolean {
35 return this.size
=== 0
39 * Checks whether the buffer is full.
40 * @returns Whether the buffer is full.
42 public full (): boolean {
43 return this.size
=== this.items
.length
47 * Puts number into buffer.
48 * @param number - Number to put into buffer.
50 public put (number: number): void {
51 this.items
[this.writeIdx
] = number
52 this.writeIdx
= this.writeIdx
=== this.maxArrayIdx
? 0 : this.writeIdx
+ 1
53 if (this.size
< this.items
.length
) {
59 * Gets number from buffer.
60 * @returns Number from buffer.
62 public get (): number | undefined {
63 const number = this.items
[this.readIdx
]
67 this.items
[this.readIdx
] = -1
68 this.readIdx
= this.readIdx
=== this.maxArrayIdx
? 0 : this.readIdx
+ 1
74 * Returns buffer as numbers' array.
75 * @returns Numbers' array.
77 public toArray (): number[] {
78 return Array.from(this.items
.filter(item
=> item
!== -1))
82 * Checks the buffer size.
83 * @param size - Buffer size.
85 private checkSize (size
: number): void {
86 if (!Number.isSafeInteger(size
)) {
88 `Invalid circular buffer size: '${size.toString()}' is not an integer`
93 `Invalid circular buffer size: ${size.toString()} < 0`