@d1g1tal/collections
Version:
JavaScript Collections ES Modules
3 lines (2 loc) • 2.09 kB
JavaScript
import{KeyedNode as s}from"./keyed-node";class o{$map;$head=null;$tail=null;constructor(){this.$map=new Map}get(e){return this.$map.get(e)?.value}set(e,i){const t=this.$map.get(e);t!==void 0?(t.value=i,this.$moveToLast(t)):this.appendNewNode(e,i)}remove(e){return e===null?!1:this.unlinkNode(this.$map.get(e))?this.$map.delete(e):!1}addFirst(e,i){const t=this.$map.get(e);t!==void 0?(this.$moveToFirst(t),t.value=i):this.prependNewNode(e,i)}addLast(e,i){const t=this.$map.get(e);t!==void 0?(this.$moveToLast(t),t.value=i):this.appendNewNode(e,i)}moveToFirst(e){this.$moveToFirst(this.$map.get(e))}moveToLast(e){this.$moveToLast(this.$map.get(e))}getFirst(){return this.$head?.value??null}getLast(){return this.$tail?.value??null}removeFirst(){return this.$head===null?!1:this.remove(this.$head.key)}removeLast(){return this.$tail===null?!1:this.remove(this.$tail.key)}has(e){return this.$map.has(e)}forEach(e,i=this){for(const[t,l]of this)e.call(i,l,t,this)}clear(){this.$map.clear(),this.$head=this.$tail=null}get size(){return this.$map.size}*keys(){for(const[e]of this)yield e}*values(){for(const[e,i]of this)yield i}*entries(){yield*this}*[Symbol.iterator](){for(let e=this.$head;e!==null;e=e.next)yield[e.key,e.value]}get[Symbol.toStringTag](){return"LinkedMap"}unlinkNode(e){return e===void 0?!1:(e.previous!==null?e.previous.next=e.next:this.$head=e.next,e.next!==null?e.next.previous=e.previous:this.$tail=e.previous,e.previous=null,e.next=null,!0)}prependNewNode(e,i){const t=new s({key:e,value:i});this.$map.set(e,t),this.$head===null?this.$head=this.$tail=t:(t.next=this.$head,this.$head.previous=t,this.$head=t)}appendNewNode(e,i){const t=new s({key:e,value:i});this.$map.set(e,t),this.$head===null?this.$head=this.$tail=t:(t.previous=this.$tail,this.$tail.next=t,this.$tail=t)}$moveToFirst(e){e===void 0||e===this.$head||(this.unlinkNode(e),e.next=this.$head,this.$head.previous=e,this.$head=e)}$moveToLast(e){e===void 0||e===this.$tail||(this.unlinkNode(e),e.previous=this.$tail,this.$tail.next=e,this.$tail=e)}}export{o as LinkedMap};
//# sourceMappingURL=linked-map.js.map