// Event Queue is simply a priority Queue, basic implementation O(n^2) class EventQueue { constructor(size) { this.size=size; this.queue=new Array(size); this.frontIndex=0; this.time=0; } add(obj,delay){ if(obj.queueProperties.inQueue){ obj.queueProperties.time=this.time+(delay||obj.propagationDelay); let i=obj.queueProperties.index; while(i>0 && obj.queueProperties.time>this.queue[i-1].queueProperties.time){ this.swap(i,i-1) i--; } i=obj.queueProperties.index; while(i0 && obj.queueProperties.time>this.queue[i-1].queueProperties.time){ this.swap(i,i-1) i--; } } addImmediate(obj){ this.queue[this.frontIndex]=obj; obj.queueProperties.time=this.time; obj.queueProperties.index=this.frontIndex; obj.queueProperties.inQueue=true; this.frontIndex++; } swap(v1,v2){ let obj1= this.queue[v1]; obj1.queueProperties.index=v2; let obj2= this.queue[v2]; obj2.queueProperties.index=v1; this.queue[v1]=obj2; this.queue[v2]=obj1; } pop(){ if(this.isEmpty())throw "Queue Empty" this.frontIndex--; let obj=this.queue[this.frontIndex] this.time=obj.queueProperties.time; obj.queueProperties.inQueue=false; return obj; } reset(){ for(let i=0;i