UNPKG

@akashbabu/node-dll

Version:

DLL(doubly linked list) library for javascript projects

2 lines (1 loc) 2.28 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).DLL={})}(this,(function(t){"use strict";class e{constructor(t,e=null,s=null){this.data=t,this.prev=e,this.next=s}}class s{grantAccess(t){return t.__dllItem__}revokeAccess(t){return t?new r(t):null}}class r{constructor(t){this.dllItem=t,this.dllItemAccessRestrictor=new s,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)}}t.DLL=class{constructor(){this.state=this.getFreshState(),this.dllItemAccessRestrictor=new s}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 t=this.state.head;if(!(t instanceof e))return;this.remove(t);const s=t.data;return t=null,s}unshift(t){const s=this.state.head,r=new e(t,null,s);this.state.head=r,s instanceof e?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(t,s){let n;if(null===t&&this.state.length>0)throw Error("Invalid Node `null`: DLL is not empty, hence can't append to the given node");n=t instanceof r?this.dllItemAccessRestrictor.grantAccess(t):t;const i=new e(s);return null===n?this.state.head=this.state.tail=i:(i.prev=n,i.next=n.next,n.next=i,n===this.state.tail&&(this.state.tail=i)),this.state.length++,this.dllItemAccessRestrictor.revokeAccess(i)}remove(t){let s;if(t instanceof r)s=this.dllItemAccessRestrictor.grantAccess(t);else{if(!(t instanceof e))return!1;s=t}return s.prev?s.prev.next=s.next:this.state.head=s.next,s.next?s.next.prev=s.prev:this.state.tail=s.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}},t.DLLItem=r,Object.defineProperty(t,"__esModule",{value:!0})}));