lruQueue.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // (c) 2018, Mariusz Nowak
  2. // SPDX-License-Identifier: ISC
  3. // Derived from https://github.com/medikoo/lru-queue
  4. export function lruQueue(limit) {
  5. var size = 0;
  6. var base = 1;
  7. var queue = Object.create(null);
  8. var map = Object.create(null);
  9. var index = 0;
  10. var del = function del(id) {
  11. var oldIndex = map[id];
  12. if (!oldIndex) return;
  13. delete queue[oldIndex];
  14. delete map[id];
  15. --size;
  16. if (base !== oldIndex) return;
  17. if (!size) {
  18. index = 0;
  19. base = 1;
  20. return;
  21. }
  22. while (!hasOwnProperty.call(queue, ++base)) {
  23. continue;
  24. }
  25. };
  26. limit = Math.abs(limit);
  27. return {
  28. hit: function hit(id) {
  29. var oldIndex = map[id];
  30. var nuIndex = ++index;
  31. queue[nuIndex] = id;
  32. map[id] = nuIndex;
  33. if (!oldIndex) {
  34. ++size;
  35. if (size <= limit) return undefined;
  36. id = queue[base];
  37. del(id);
  38. return id;
  39. }
  40. delete queue[oldIndex];
  41. if (base !== oldIndex) return undefined;
  42. while (!hasOwnProperty.call(queue, ++base)) {
  43. continue;
  44. }
  45. return undefined;
  46. },
  47. delete: del,
  48. clear: function clear() {
  49. size = index = 0;
  50. base = 1;
  51. queue = Object.create(null);
  52. map = Object.create(null);
  53. }
  54. };
  55. }