Skip to content

Instantly share code, notes, and snippets.

@kitcat-dev
Created August 1, 2024 18:29
Show Gist options
  • Save kitcat-dev/d3ba2f99c2b937d7649cb139f6bff1b8 to your computer and use it in GitHub Desktop.
Save kitcat-dev/d3ba2f99c2b937d7649cb139f6bff1b8 to your computer and use it in GitHub Desktop.

Revisions

  1. kitcat-dev created this gist Aug 1, 2024.
    65 changes: 65 additions & 0 deletions bidirectional-map.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,65 @@
    class BidirectionalMap<T> {
    private forwardMap: Map<T, T>;
    private backwardMap: Map<T, T>;

    constructor() {
    this.forwardMap = new Map();
    this.backwardMap = new Map();
    }

    set(key: T, value: T): void {
    const oldValue = this.forwardMap.get(key);
    if (oldValue) {
    this.backwardMap.delete(oldValue);
    }

    const oldKey = this.backwardMap.get(value);
    if (oldKey) {
    this.forwardMap.delete(oldKey);
    }

    this.forwardMap.set(key, value);
    this.backwardMap.set(value, key);
    }

    getKey(value: T): T | undefined {
    return this.backwardMap.get(value);
    }

    getValue(key: T): T | undefined {
    return this.forwardMap.get(key);
    }

    hasKey(key: T): boolean {
    return this.forwardMap.has(key);
    }

    hasValue(value: T): boolean {
    return this.backwardMap.has(value);
    }

    deleteKey(key: T): void {
    if (this.forwardMap.has(key)) {
    const value = this.forwardMap.get(key);
    this.forwardMap.delete(key);
    if (value !== undefined) {
    this.backwardMap.delete(value);
    }
    }
    }

    deleteValue(value: T): void {
    if (this.backwardMap.has(value)) {
    const key = this.backwardMap.get(value);
    this.backwardMap.delete(value);
    if (key !== undefined) {
    this.forwardMap.delete(key);
    }
    }
    }

    clear(): void {
    this.forwardMap.clear();
    this.backwardMap.clear();
    }
    }