lruQueue.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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)) continue;
  23. };
  24. limit = Math.abs(limit);
  25. return {
  26. hit: function hit(id) {
  27. var oldIndex = map[id];
  28. var nuIndex = ++index;
  29. queue[nuIndex] = id;
  30. map[id] = nuIndex;
  31. if (!oldIndex) {
  32. ++size;
  33. if (size <= limit) return undefined;
  34. id = queue[base];
  35. del(id);
  36. return id;
  37. }
  38. delete queue[oldIndex];
  39. if (base !== oldIndex) return undefined;
  40. while (!hasOwnProperty.call(queue, ++base)) continue;
  41. return undefined;
  42. },
  43. delete: del,
  44. clear: function clear() {
  45. size = index = 0;
  46. base = 1;
  47. queue = Object.create(null);
  48. map = Object.create(null);
  49. }
  50. };
  51. }