lruQueue.js 1.3 KB

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