bi-map.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /**
  2. * A bidirectional map written in TypeScript.
  3. *
  4. * @author Trevor Sears <trevorsears.main@gmail.com>
  5. * @version v1.0.0
  6. * @since v0.1.0
  7. */
  8. export class BiMap<K = any, V = any> {
  9. public primaryMap: Map<K, V>;
  10. public secondaryMap: Map<V, K>;
  11. public constructor() {
  12. this.primaryMap = new Map<K, V>();
  13. this.secondaryMap = new Map<V, K>();
  14. }
  15. public getValues(): IterableIterator<V> {
  16. return this.primaryMap.values();
  17. }
  18. public get(key: K): V | undefined {
  19. return this.getFromKey(key);
  20. }
  21. public set(key: K, value: V): void {
  22. this.setFromKey(key, value);
  23. }
  24. public getFromKey(key: K): V | undefined {
  25. return this.primaryMap.get(key);
  26. }
  27. public getFromValue(value: V): K | undefined {
  28. return this.secondaryMap.get(value);
  29. }
  30. public setFromKey(key: K, value: V): void {
  31. this.primaryMap.set(key, value);
  32. this.secondaryMap.set(value, key);
  33. }
  34. public setFromValue(value: V, key: K): void {
  35. this.setFromKey(key, value);
  36. }
  37. public removeByKey(key: K): V | undefined {
  38. if (this.primaryMap.has(key)) {
  39. const value: V = this.primaryMap.get(key) as V;
  40. this.primaryMap.delete(key);
  41. this.secondaryMap.delete(value);
  42. return value;
  43. } else return undefined;
  44. }
  45. public removeByValue(value: V): K | undefined {
  46. if (this.secondaryMap.has(value)) {
  47. const key: K = this.secondaryMap.get(value) as K;
  48. this.primaryMap.delete(key);
  49. this.secondaryMap.delete(value);
  50. return key;
  51. } else return undefined;
  52. }
  53. public hasKey(key: K): boolean {
  54. return this.primaryMap.has(key);
  55. }
  56. public hasValue(value: V): boolean {
  57. return this.secondaryMap.has(value);
  58. }
  59. public clear(): void {
  60. this.primaryMap.clear();
  61. this.secondaryMap.clear();
  62. }
  63. public size(): number {
  64. return this.primaryMap.size;
  65. }
  66. }