multiMap.js 1.5 KB

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