lruQueue.js 1.3 KB

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