lruQueue.js (1389B)
1 "use strict"; 2 3 Object.defineProperty(exports, "__esModule", { 4 value: true 5 }); 6 exports.lruQueue = lruQueue; 7 8 // (c) 2018, Mariusz Nowak 9 // SPDX-License-Identifier: ISC 10 // Derived from https://github.com/medikoo/lru-queue 11 function lruQueue(limit) { 12 var size = 0; 13 var base = 1; 14 var queue = Object.create(null); 15 var map = Object.create(null); 16 var index = 0; 17 18 var del = function del(id) { 19 var oldIndex = map[id]; 20 if (!oldIndex) return; 21 delete queue[oldIndex]; 22 delete map[id]; 23 --size; 24 if (base !== oldIndex) return; 25 26 if (!size) { 27 index = 0; 28 base = 1; 29 return; 30 } 31 32 while (!hasOwnProperty.call(queue, ++base)) { 33 continue; 34 } 35 }; 36 37 limit = Math.abs(limit); 38 return { 39 hit: function hit(id) { 40 var oldIndex = map[id]; 41 var nuIndex = ++index; 42 queue[nuIndex] = id; 43 map[id] = nuIndex; 44 45 if (!oldIndex) { 46 ++size; 47 if (size <= limit) return undefined; 48 id = queue[base]; 49 del(id); 50 return id; 51 } 52 53 delete queue[oldIndex]; 54 if (base !== oldIndex) return undefined; 55 56 while (!hasOwnProperty.call(queue, ++base)) { 57 continue; 58 } 59 60 return undefined; 61 }, 62 delete: del, 63 clear: function clear() { 64 size = index = 0; 65 base = 1; 66 queue = Object.create(null); 67 map = Object.create(null); 68 } 69 }; 70 } 71 72 ;