@akashbabu/node-dll
Version:
DLL(doubly linked list) library for javascript projects
2 lines (1 loc) • 2.05 kB
JavaScript
class t{constructor(t,e=null,s=null){this.data=t,this.prev=e,this.next=s}}class e{grantAccess(t){return t.__dllItem__}revokeAccess(t){return t?new s(t):null}}class s{constructor(t){this.dllItem=t,this.dllItemAccessRestrictor=new e,this.__dllItem__=t}get data(){return this.dllItem.data}set data(t){this.dllItem.data=t}get prev(){return this.dllItemAccessRestrictor.revokeAccess(this.dllItem.prev)}get next(){return this.dllItemAccessRestrictor.revokeAccess(this.dllItem.next)}}class r{constructor(){this.state=this.getFreshState(),this.dllItemAccessRestrictor=new e}get head(){return this.dllItemAccessRestrictor.revokeAccess(this.state.head)}get tail(){return this.dllItemAccessRestrictor.revokeAccess(this.state.tail)}get length(){return this.state.length}shift(){let e=this.state.head;if(!(e instanceof t))return;this.remove(e);const s=e.data;return e=null,s}unshift(e){const s=this.state.head,r=new t(e,null,s);this.state.head=r,s instanceof t?s.prev=r:this.state.tail=r,this.state.length++}forEach(t){this.iterate((e,s)=>{t(e.data,s)})}map(t){const e=[];return this.forEach((s,r)=>{e.push(t(s,r))}),e}push(t){return this.appendAfter(this.state.tail,t)}appendAfter(e,r){let n;if(null===e&&this.state.length>0)throw Error("Invalid Node `null`: DLL is not empty, hence can't append to the given node");n=e instanceof s?this.dllItemAccessRestrictor.grantAccess(e):e;const a=new t(r);return null===n?this.state.head=this.state.tail=a:(a.prev=n,a.next=n.next,n.next=a,n===this.state.tail&&(this.state.tail=a)),this.state.length++,this.dllItemAccessRestrictor.revokeAccess(a)}remove(e){let r;if(e instanceof s)r=this.dllItemAccessRestrictor.grantAccess(e);else{if(!(e instanceof t))return!1;r=e}return r.prev?r.prev.next=r.next:this.state.head=r.next,r.next?r.next.prev=r.prev:this.state.tail=r.prev,this.state.length--,!0}clear(){this.iterate(t=>{t.prev=t.next=null}),this.state=this.getFreshState()}getFreshState(){return{length:0,head:null,tail:null}}iterate(t){let e=this.state.head,s=0;for(;e;)t(e,s++),e=e.next}}export{r as DLL,s as DLLItem};