Lru.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. var LinkedList = require('./LinkedList');
  2. var PseudoMap = require('./PseudoMap');
  3. var Class = require('./Class');
  4. exports = Class({
  5. initialize: function Lru(max) {
  6. this._max = max;
  7. this._list = new LinkedList();
  8. this._map = new PseudoMap();
  9. },
  10. has: function(key) {
  11. return this._map.has(key);
  12. },
  13. remove: function(key) {
  14. var map = this._map;
  15. if (this.has(key)) {
  16. var node = map.get(key);
  17. this._list.rmNode(node);
  18. map.delete(key);
  19. }
  20. },
  21. get: function(key) {
  22. var list = this._list;
  23. var map = this._map;
  24. var ret;
  25. if (this.has(key)) {
  26. var node = map.get(key);
  27. ret = node.value.val;
  28. list.rmNode(node);
  29. list.unshift(node.value);
  30. map.set(key, list.head);
  31. }
  32. return ret;
  33. },
  34. set: function(key, val) {
  35. var list = this._list;
  36. var map = this._map;
  37. if (this.has(key)) {
  38. var node = map.get(key);
  39. list.rmNode(node);
  40. list.unshift({
  41. key: key,
  42. val: val
  43. });
  44. map.set(key, list.head);
  45. } else {
  46. list.unshift({
  47. key: key,
  48. val: val
  49. });
  50. map.set(key, list.head);
  51. if (list.size > this._max) {
  52. var item = list.pop();
  53. map.delete(item.key);
  54. }
  55. }
  56. },
  57. clear: function() {
  58. this._map = new PseudoMap();
  59. this._list = new LinkedList();
  60. }
  61. });
  62. module.exports = exports;