{"version":3,"sources":["../../source/findNumbers/LRUCache.js"],"names":["Node","key","value","next","prev","LRUCache","limit","size","head","tail","cache","ensureLimit","node","remove","put","console","log"],"mappings":";;;;;;;;;;;;;AAAA;IAEMA,I,GACJ,cAAYC,GAAZ,EAAiBC,KAAjB,EAAkD;AAAA,MAA1BC,IAA0B,uEAAnB,IAAmB;AAAA,MAAbC,IAAa,uEAAN,IAAM;;AAAA;;AAChD,OAAKH,GAAL,GAAWA,GAAX;AACA,OAAKC,KAAL,GAAaA,KAAb;AACA,OAAKC,IAAL,GAAYA,IAAZ;AACA,OAAKC,IAAL,GAAYA,IAAZ;AACD,C;;IAGkBC,Q;;;AACnB;AACA,sBAAwB;AAAA,QAAZC,KAAY,uEAAJ,EAAI;;AAAA;;AACtB,SAAKC,IAAL,GAAY,CAAZ;AACA,SAAKD,KAAL,GAAaA,KAAb;AACA,SAAKE,IAAL,GAAY,IAAZ;AACA,SAAKC,IAAL,GAAY,IAAZ;AACA,SAAKC,KAAL,GAAa,EAAb;AACD,G,CAED;AACA;;;;;wBACIT,G,EAAKC,K,EAAM;AACb,WAAKS,WAAL;;AAEA,UAAG,CAAC,KAAKH,IAAT,EAAc;AACZ,aAAKA,IAAL,GAAY,KAAKC,IAAL,GAAY,IAAIT,IAAJ,CAASC,GAAT,EAAcC,KAAd,CAAxB;AACD,OAFD,MAEK;AACH,YAAMU,IAAI,GAAG,IAAIZ,IAAJ,CAASC,GAAT,EAAcC,KAAd,EAAqB,KAAKM,IAA1B,CAAb;AACA,aAAKA,IAAL,CAAUJ,IAAV,GAAiBQ,IAAjB;AACA,aAAKJ,IAAL,GAAYI,IAAZ;AACD,OATY,CAWb;;;AACA,WAAKF,KAAL,CAAWT,GAAX,IAAkB,KAAKO,IAAvB;AACA,WAAKD,IAAL;AACD,K,CAED;;;;wBACIN,G,EAAI;AACN,UAAG,KAAKS,KAAL,CAAWT,GAAX,CAAH,EAAmB;AACjB,YAAMC,KAAK,GAAG,KAAKQ,KAAL,CAAWT,GAAX,EAAgBC,KAA9B,CADiB,CAGjB;;AACA,aAAKW,MAAL,CAAYZ,GAAZ,EAJiB,CAKjB;;AACA,aAAKa,GAAL,CAASb,GAAT,EAAcC,KAAd;AAEA,eAAOA,KAAP;AACD;;AAEDa,MAAAA,OAAO,CAACC,GAAR,+CAAmDf,GAAnD;AACD;;;kCAEY;AACX,UAAG,KAAKM,IAAL,KAAc,KAAKD,KAAtB,EAA4B;AAC1B,aAAKO,MAAL,CAAY,KAAKJ,IAAL,CAAUR,GAAtB;AACD;AACF;;;2BAEMA,G,EAAI;AACT,UAAMW,IAAI,GAAG,KAAKF,KAAL,CAAWT,GAAX,CAAb;;AAEA,UAAGW,IAAI,CAACR,IAAL,KAAc,IAAjB,EAAsB;AACpBQ,QAAAA,IAAI,CAACR,IAAL,CAAUD,IAAV,GAAiBS,IAAI,CAACT,IAAtB;AACD,OAFD,MAEK;AACH,aAAKK,IAAL,GAAYI,IAAI,CAACT,IAAjB;AACD;;AAED,UAAGS,IAAI,CAACT,IAAL,KAAc,IAAjB,EAAsB;AACpBS,QAAAA,IAAI,CAACT,IAAL,CAAUC,IAAV,GAAiBQ,IAAI,CAACR,IAAtB;AACD,OAFD,MAEK;AACH,aAAKK,IAAL,GAAYG,IAAI,CAACR,IAAjB;AACD;;AAED,aAAO,KAAKM,KAAL,CAAWT,GAAX,CAAP;AACA,WAAKM,IAAL;AACD;;;4BAEO;AACN,WAAKC,IAAL,GAAY,IAAZ;AACA,WAAKC,IAAL,GAAY,IAAZ;AACA,WAAKF,IAAL,GAAY,CAAZ;AACA,WAAKG,KAAL,GAAa,EAAb;AACD,K,CAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sourcesContent":["// https://medium.com/dsinjs/implementing-lru-cache-in-javascript-94ba6755cda9\r\n\r\nclass Node {\r\n constructor(key, value, next = null, prev = null) {\r\n this.key = key;\r\n this.value = value;\r\n this.next = next;\r\n this.prev = prev;\r\n }\r\n}\r\n\r\nexport default class LRUCache {\r\n //set default limit of 10 if limit is not passed.\r\n constructor(limit = 10) {\r\n this.size = 0;\r\n this.limit = limit;\r\n this.head = null;\r\n this.tail = null;\r\n this.cache = {};\r\n }\r\n\r\n // Write Node to head of LinkedList\r\n // update cache with Node key and Node reference\r\n put(key, value){\r\n this.ensureLimit();\r\n\r\n if(!this.head){\r\n this.head = this.tail = new Node(key, value);\r\n }else{\r\n const node = new Node(key, value, this.head);\r\n this.head.prev = node;\r\n this.head = node;\r\n }\r\n\r\n //Update the cache map\r\n this.cache[key] = this.head;\r\n this.size++;\r\n }\r\n\r\n // Read from cache map and make that node as new Head of LinkedList\r\n get(key){\r\n if(this.cache[key]){\r\n const value = this.cache[key].value;\r\n\r\n // node removed from it's position and cache\r\n this.remove(key)\r\n // write node again to the head of LinkedList to make it most recently used\r\n this.put(key, value);\r\n\r\n return value;\r\n }\r\n\r\n console.log(`Item not available in cache for key ${key}`);\r\n }\r\n\r\n ensureLimit(){\r\n if(this.size === this.limit){\r\n this.remove(this.tail.key)\r\n }\r\n }\r\n\r\n remove(key){\r\n const node = this.cache[key];\r\n\r\n if(node.prev !== null){\r\n node.prev.next = node.next;\r\n }else{\r\n this.head = node.next;\r\n }\r\n\r\n if(node.next !== null){\r\n node.next.prev = node.prev;\r\n }else{\r\n this.tail = node.prev\r\n }\r\n\r\n delete this.cache[key];\r\n this.size--;\r\n }\r\n\r\n clear() {\r\n this.head = null;\r\n this.tail = null;\r\n this.size = 0;\r\n this.cache = {};\r\n }\r\n\r\n // // Invokes the callback function with every node of the chain and the index of the node.\r\n // forEach(fn) {\r\n // let node = this.head;\r\n // let counter = 0;\r\n // while (node) {\r\n // fn(node, counter);\r\n // node = node.next;\r\n // counter++;\r\n // }\r\n // }\r\n\r\n // // To iterate over LRU with a 'for...of' loop\r\n // *[Symbol.iterator]() {\r\n // let node = this.head;\r\n // while (node) {\r\n // yield node;\r\n // node = node.next;\r\n // }\r\n // }\r\n}"],"file":"LRUCache.js"}