Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. const KEYS = 1;
  2. const VALUES = 2;
  3. const KEYS_VALUES = 3;
  4.  
  5. export default class WeakValueMap {
  6. #map = new Map();
  7. #group = new FinalizationGroup((iterator) => {
  8. for (const key of iterator) {
  9. this.#map.delete(key);
  10. }
  11. });
  12.  
  13. constructor(iterable) {
  14. if (iterable !== undefined && iterable !== null) {
  15. for (const [key, value] of iterable) {
  16. this.set(key, value);
  17. }
  18. }
  19. }
  20.  
  21. set(key, value) {
  22. this.#group.unregister(key);
  23. this.#map.set(key, new WeakRef(value));
  24. this.#group.register(value, key, key);
  25. }
  26.  
  27. has(key) {
  28. const w = this.#map.get(key);
  29. if (w === undefined) {
  30. return false;
  31. }
  32. if (w.deref() === undefined) {
  33. this.#map.delete(key);
  34. this.#group.unregister(key);
  35. return false;
  36. }
  37. return true;
  38. }
  39.  
  40. get(key) {
  41. const w = this.#map.get(key);
  42. if (w === undefined) {
  43. return undefined;
  44. }
  45. const v = w.deref();
  46. if (v === undefined) {
  47. this.#map.delete(key);
  48. this.#group.unregister(key);
  49. return undefined;
  50. }
  51. return v;
  52. }
  53.  
  54. delete(key) {
  55. const removed = this.#map.delete(key);
  56. if (removed) {
  57. this.#group.unregister(key);
  58. return true;
  59. }
  60. return false;
  61. }
  62.  
  63. clear() {
  64. for (const key of this.#map.keys()) {
  65. this.#group.unregister(key);
  66. }
  67. this.#map.clear();
  68. }
  69.  
  70. #iterator = function* iterator(type) {
  71. for (const [key, weak] of this.#map) {
  72. const v = weak.deref();
  73. if (v === undefined) {
  74. this.#map.delete(key);
  75. this.#group.unregister(key);
  76. } else if (type === KEYS) {
  77. yield key;
  78. } else if (type === VALUES) {
  79. yield v;
  80. } else {
  81. yield [key, v];
  82. }
  83. }
  84. };
  85.  
  86. keys() {
  87. return this.#iterator(KEYS);
  88. }
  89.  
  90. values() {
  91. return this.#iterator(VALUES);
  92. }
  93.  
  94. entries() {
  95. return this.#iterator(KEYS_VALUES);
  96. }
  97.  
  98. forEach(callback, thisArg) {
  99. for (const [key, value] of this) {
  100. callback.call(thisArg, key, value, this);
  101. }
  102. }
  103. }
  104.  
  105. Object.defineProperty(WeakValueMap.prototype, Symbol.iterator, {
  106. value: WeakValueMap.prototype.entries,
  107. writable: true,
  108. enumerable: false,
  109. configurable: true,
  110. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement