@se-oss/circular-buffer
Version:
Circular Buffer implementation for JavaScript
2 lines (1 loc) • 1.71 kB
JavaScript
"use strict";var a=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var c=(e,t)=>{for(var i in t)a(e,i,{get:t[i],enumerable:!0})},f=(e,t,i,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of u(t))!n.call(e,r)&&r!==i&&a(e,r,{get:()=>t[r],enumerable:!(s=l(t,r))||s.enumerable});return e};var o=e=>f(a({},"__esModule",{value:!0}),e);var b={};c(b,{CircularBuffer:()=>h});module.exports=o(b);var h=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 s of this)t(s,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}};0&&(module.exports={CircularBuffer});