an invertible map maintains a bidirectional one-to-many mapping between keys (of kind K) and collection of values (of kind Set<V>).
the reverse mapping is also a one-to-many between keys (of kind V) and collection of values (of kind Set<K>).
the dual map model of this class allows for quick lookups and mutations both directions.
this data structure highly resembles a directed graph's edges.

const bimap = new InvertibleMap<number, string>()

// add values to the forward map
bimap.add(1, "one", "first")
bimap.add(2, "two", "second")

// add values to the reverse map
bimap.radd("second", 3, 4, 5)

// perform lookups in both directions
console.log(bimap.get(1)) // `Set(["one", "first"])`
console.log(bimap.rget("second")) // `Set([2, 3, 4, 5])`

// remove entries while maintaining invertibility
bimap.delete(6) // `false` because the key never existed
bimap.delete(2) // `true`
console.log(bimap.rget("second")) // `Set([3, 4, 5])`
bimap.rremove("second", 4, 5, 6, 7)
console.log(bimap.rget("second")) // `Set([3])`

// iterate over the forward map
const bimap_entries: [key: number, values: string[]][] = []
for (const [k, v] of bimap) { bimap_entries.push([k, [...v]]) }
console.log(bimap_entries) // `[[1, ["one", "first"]], [3, ["second"]], [4, []], [5, []]]`

// clear the entire bidirectional map
bimap.clear()

Type Parameters

  • K

    the type of keys in the forward map

  • V

    the type of values in the reverse map

Implements

Constructors

  • create an empty invertible map.
    optionally provide an initial forward_map to populate the forward mapping, and then automatically deriving the reverse mapping from it.
    or provide an initial reverse_map to populate the reverse mapping, and then automatically deriving the froward mapping from it.
    if both forward_map and reverse_map are provided, then it will be up to YOU to make sure that they are actual inverses of each other.

    Type Parameters

    • K
    • V

    Parameters

    • Optionalforward_map: Map<K, Set<V>>

      initiallize by populating with an optional initial forward map (the reverse map will be automatically computed if reverse_map === undefined)

    • Optionalreverse_map: Map<V, Set<K>>

      initiallize by populating with an optional initial reverse map (the forward map will be automatically computed if forward_map === undefined)

    Returns InvertibleMap<K, V>

Properties

fmap: Map<K, Set<V>>

forward mapping. not intended for direct access, since manually mutating it will ruin the invertibility with the reverse map if you're not careful.

rmap: Map<V, Set<K>>

reverse mapping. not intended for direct access, since manually mutating it will ruin the invertibility with the forward map if you're not careful.

size: number

size of the forward map

rsize: number

size of the reverse map

add: ((key: K, ...items: V[]) => void)

at a specific key in the forward map, add the list of items, and then also assign key to the list of items in the reverse map to maintain invertibility.

radd: ((key: V, ...items: K[]) => void)

at a specific key in the reverse map, add the list of items, and then also assign key to the list of items in the forward map to maintain invertibility.

clear: (() => void)

clear out both forward and reverse maps completely of all their entries

delete: ((key: K, keep_key?: boolean) => boolean)

delete a key in the forward map, and also remove its mentions from the reverse map's entries.
if keep_key is optionally set to true, we will only clear out the set of items held by the forward map at the key, and keep the key itself intact (along with the original (now mutated and clear) Set<V> which the key refers to)

rdelete: ((key: V, keep_key?: boolean) => boolean)

delete a key in the reverse map, and also remove its mentions from the forward map's entries.
if keep_key is optionally set to true, we will only clear out the set of items held by the reverse map at the key, and keep the key itself intact (along with the original (now mutated and clear) Set<V> which the key refers to)

remove: ((key: K, ...items: V[]) => void)

at a specific key in the forward map, remove/delete the list of items, and then also remove key from the list of items in the reverse map to maintain invertibility.

rremove: ((key: V, ...items: K[]) => void)

at a specific key in the reverse map, remove/delete the list of items, and then also remove key from the list of items in the forward map to maintain invertibility.

forEach: ((callbackfn: ((value: Set<V>, key: K, map: Map<K, Set<V>>) => void), thisArg?: any) => void)

Executes a provided function once per each key/value pair in the Map, in insertion order.

rforEach: ((callbackfn: ((value: Set<K>, key: V, map: Map<V, Set<K>>) => void), thisArg?: any) => void)
get: ((key: K) => undefined | Set<V>)

Returns a specified element from the Map object. If the value that is associated to the provided key is an object, then you will get a reference to that object and any change made to that object will effectively modify it inside the Map.

Type declaration

    • (key): undefined | Set<V>
    • Parameters

      • key: K

      Returns undefined | Set<V>

      Returns the element associated with the specified key. If no element is associated with the specified key, undefined is returned.

rget: ((key: V) => undefined | Set<K>)
has: ((key: K) => boolean)

Type declaration

    • (key): boolean
    • Parameters

      • key: K

      Returns boolean

      boolean indicating whether an element with the specified key exists or not.

rhas: ((key: V) => boolean)
set: ((key: K, value: Iterable<V, any, any>) => this)

Adds a new element with a specified key and value to the Map. If an element with the same key already exists, the element will be updated.

rset: ((key: V, value: Iterable<K, any, any>) => this)
entries: (() => MapIterator<[K, Set<V>]>)

Returns an iterable of key, value pairs for every entry in the map.

rentries: (() => MapIterator<[V, Set<K>]>)

Type declaration

    • (): MapIterator<[V, Set<K>]>
    • Returns an iterable of key, value pairs for every entry in the map.

      Returns MapIterator<[V, Set<K>]>

keys: (() => MapIterator<K>)

Returns an iterable of keys in the map

rkeys: (() => MapIterator<V>)

Type declaration

    • (): MapIterator<V>
    • Returns an iterable of keys in the map

      Returns MapIterator<V>

values: (() => MapIterator<Set<V>>)

Returns an iterable of values in the map

rvalues: (() => MapIterator<Set<K>>)

Type declaration

    • (): MapIterator<Set<K>>
    • Returns an iterable of values in the map

      Returns MapIterator<Set<K>>

[iterator]: (() => MapIterator<[K, Set<V>]>)

Type declaration

    • (): MapIterator<[K, Set<V>]>
    • Returns an iterable of key, value pairs for every entry in the map.

      Returns MapIterator<[K, Set<V>]>

[toStringTag]: string