@andranik-arakelyan/js-utilities
Version:
Javascript utilities
1 lines • 1.48 kB
JavaScript
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.CircularBuffer=void 0;class CircularBuffer{buffer;head=0;tail=0;count=0;maxSize;constructor(capacity){if(!Number.isInteger(capacity)||capacity<=0){throw new Error("Capacity must be a positive integer")}this.maxSize=capacity;this.buffer=new Array(capacity)}push(item){this.buffer[this.tail]=item;if(this.isFull()){this.head=(this.head+1)%this.maxSize}else{this.count++}this.tail=(this.tail+1)%this.maxSize}shift(){if(this.isEmpty()){return undefined}const item=this.buffer[this.head];this.buffer[this.head]=undefined;this.head=(this.head+1)%this.maxSize;this.count--;return item}get(index){if(index<0||index>=this.count){throw new Error(`Index ${index} is out of bounds. Buffer size is ${this.count}`)}const actualIndex=(this.head+index)%this.maxSize;return this.buffer[actualIndex]}peek(){if(this.isEmpty()){return undefined}const lastIndex=this.tail===0?this.maxSize-1:this.tail-1;return this.buffer[lastIndex]}peekOldest(){if(this.isEmpty()){return undefined}return this.buffer[this.head]}size(){return this.count}capacity(){return this.maxSize}isFull(){return this.count===this.maxSize}isEmpty(){return this.count===0}clear(){this.buffer.fill(undefined);this.head=0;this.tail=0;this.count=0}toArray(){const result=[];for(let i=0;i<this.count;i++){result.push(this.get(i))}return result}*[Symbol.iterator](){for(let i=0;i<this.count;i++){yield this.get(i)}}}exports.CircularBuffer=CircularBuffer;