multiMap.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  4. function MultiMap() {
  5. var map = {
  6. arrayMap: [],
  7. weakMap: new WeakMap()
  8. };
  9. return {
  10. get: function get(key) {
  11. if (canBeAnArrayMapKey(key)) {
  12. return map.arrayMap[key];
  13. } else if (canBeAWeakMapKey(key)) {
  14. return map.weakMap.get(key);
  15. }
  16. },
  17. set: function set(key, value) {
  18. if (canBeAnArrayMapKey(key)) {
  19. map.arrayMap[key] = value;
  20. } else if (canBeAWeakMapKey(key)) {
  21. map.weakMap.set(key, value);
  22. } else {
  23. throw new Error('Invalid key type');
  24. }
  25. },
  26. delete: function _delete(key) {
  27. if (canBeAnArrayMapKey(key)) {
  28. delete map.arrayMap[key];
  29. } else if (canBeAWeakMapKey(key)) {
  30. map.weakMap.delete(key);
  31. }
  32. }
  33. };
  34. function canBeAnArrayMapKey(obj) {
  35. return obj !== null && !isNaNSymbol(obj) && (typeof obj == 'string' || typeof obj == 'number');
  36. }
  37. function canBeAWeakMapKey(obj) {
  38. return obj !== null && ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) == 'object' || typeof obj == 'function');
  39. }
  40. function isNaNSymbol(obj) {
  41. /* eslint-disable no-self-compare */
  42. return obj !== obj; // NaN === NaN is always false
  43. }
  44. }
  45. exports.default = MultiMap;