@se-oss/circular-buffer
Version:
Circular Buffer implementation for JavaScript
2 lines (1 loc) • 1.22 kB
JavaScript
var e=class{buffer;capacity;filled=!1;writeIndex=0;constructor(t){if(t<2)throw new Error("Capacity must be at least 2");this.capacity=t,this.buffer=new Array(t)}isEmpty(){return!this.filled&&this.writeIndex===0}isFull(){return this.filled}put(t){return this.buffer[this.writeIndex]=t,this.writeIndex++,this.writeIndex>=this.capacity&&(this.writeIndex=0,this.filled=!0),this}putAt(t,i){return this.buffer[this.relativeIndex(i)]=t,this}clear(){return this.writeIndex=0,this.filled=!1,this}size(){return this.isFull()?this.capacity:this.writeIndex}at(t){return this.buffer.at(this.relativeIndex(t))}[Symbol.iterator](){return this.iterator()}*iterator(){if(!this.isFull()){for(let i=0;i<this.writeIndex;i++)yield this.buffer[i];return}let t=this.writeIndex;for(let i=0;i<this.capacity;i++)yield this.buffer[t],t=(t+1)%this.capacity}forEach(t){let i=0;for(let r of this)t(r,i++)}toArray(){return Array.from(this)}relativeIndex(t){if(Math.abs(t)>this.capacity)throw new Error(`Index out of bounds: ${t} not in valid range [${this.capacity>0,0}..${this.capacity>0?this.capacity-1:0}] or [-${this.capacity}..-1]`);return t<0&&(t=this.size()+t),this.isFull()?(t+this.writeIndex)%this.capacity:t}};export{e as CircularBuffer};