{"version":3,"file":"MultiMap.mjs","sourceRoot":"","sources":["../../src/MultiMap.ts"],"names":[],"mappings":"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","sourcesContent":["import { from as arrayFrom } from '@dojo/shim/array';\nimport { isArrayLike, isIterable, Iterable, IterableIterator, ShimIterator } from '@dojo/shim/iterator';\nimport Map from '@dojo/shim/Map';\nimport '@dojo/shim/Symbol';\n\n/**\n * A map implmentation that supports multiple keys for specific value.\n *\n * @param T Accepts the type of the value\n */\nexport default class MultiMap<T> implements Map<any[], T> {\n\tprivate _map: Map<any, any>;\n\tprivate _key: symbol;\n\n\t/**\n\t * @constructor\n\t *\n\t * @param iterator an array or iterator of tuples to initialize the map with.\n\t */\n\tconstructor(iterable?: ArrayLike<[any[], T]> | Iterable<[any[], T]>) {\n\t\tthis._map = new Map<any, any>();\n\t\tthis._key = Symbol();\n\t\tif (iterable) {\n\t\t\tif (isArrayLike(iterable)) {\n\t\t\t\tfor (let i = 0; i < iterable.length; i++) {\n\t\t\t\t\tconst value = iterable[i];\n\t\t\t\t\tthis.set(value[0], value[1]);\n\t\t\t\t}\n\t\t\t} else if (isIterable(iterable)) {\n\t\t\t\tfor (const value of iterable) {\n\t\t\t\t\tthis.set(value[0], value[1]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Sets the value for the array of keys provided\n\t *\n\t * @param keys The array of keys to store the value against\n\t * @param value the value of the map entry\n\t *\n\t * @return the multi map instance\n\t */\n\tset(keys: any[], value: T): this {\n\t\tlet map = this._map;\n\t\tlet childMap;\n\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tif (map.get(keys[i])) {\n\t\t\t\tmap = map.get(keys[i]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tchildMap = new Map<any, any>();\n\t\t\tmap.set(keys[i], childMap);\n\t\t\tmap = childMap;\n\t\t}\n\n\t\tmap.set(this._key, value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the value entry for the array of keys\n\t *\n\t * @param keys The array of keys to look up the value for\n\t *\n\t * @return The value if found otherwise `undefined`\n\t */\n\tget(keys: any[]): T | undefined {\n\t\tlet map = this._map;\n\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tmap = map.get(keys[i]);\n\n\t\t\tif (!map) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\n\t\treturn map.get(this._key);\n\t}\n\n\t/**\n\t * Returns a boolean indicating if the key exists in the map\n\t *\n\t * @return boolean true if the key exists otherwise false\n\t */\n\thas(keys: any[]): boolean {\n\t\tlet map = this._map;\n\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tmap = map.get(keys[i]);\n\t\t\tif (!map) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Returns the size of the map, based on the number of unique keys\n\t */\n\tget size(): number {\n\t\treturn arrayFrom(this.keys()).length;\n\t}\n\n\t/**\n\t * Deletes the entry for the key provided.\n\t *\n\t * @param keys the key of the entry to remove\n\t * @return boolean trus if the entry was deleted, false if the entry was not found\n\t */\n\tdelete(keys: any[]): boolean {\n\t\tlet map = this._map;\n\t\tconst path = [this._map];\n\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tmap = map.get(keys[i]);\n\t\t\tpath.push(map);\n\t\t\tif (!map) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tmap.delete(this._key);\n\n\t\tfor (let i = keys.length - 1; i >= 0; i--) {\n\t\t\tmap = path[i].get(keys[i]);\n\t\t\tif (map.size) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpath[i].delete(keys[i]);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Return an iterator that yields each value in the map\n\t *\n\t * @return An iterator containing the instance's values.\n\t */\n\tvalues(): IterableIterator<T> {\n\t\tconst values: T[] = [];\n\n\t\tconst getValues = (map: Map<any, any>) => {\n\t\t\tmap.forEach((value, key) => {\n\t\t\t\tif (key === this._key) {\n\t\t\t\t\tvalues.push(value);\n\t\t\t\t} else {\n\t\t\t\t\tgetValues(value);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tgetValues(this._map);\n\t\treturn new ShimIterator<T>(values);\n\t}\n\n\t/**\n\t * Return an iterator that yields each key array in the map\n\t *\n\t * @return An iterator containing the instance's keys.\n\t */\n\tkeys(): IterableIterator<any[]> {\n\t\tconst finalKeys: any[][] = [];\n\n\t\tconst getKeys = (map: Map<any, any>, keys: any[] = []) => {\n\t\t\tmap.forEach((value, key) => {\n\t\t\t\tif (key === this._key) {\n\t\t\t\t\tfinalKeys.push(keys);\n\t\t\t\t} else {\n\t\t\t\t\tconst nextKeys = [...keys, key];\n\t\t\t\t\tgetKeys(value, nextKeys);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tgetKeys(this._map);\n\t\treturn new ShimIterator<any[]>(finalKeys);\n\t}\n\n\t/**\n\t * Returns an iterator that yields each key/value pair as an array.\n\t *\n\t * @return An iterator for each key/value pair in the instance.\n\t */\n\tentries(): IterableIterator<[any[], T]> {\n\t\tconst finalEntries: [any[], T][] = [];\n\n\t\tconst getKeys = (map: Map<any, any>, keys: any[] = []) => {\n\t\t\tmap.forEach((value, key) => {\n\t\t\t\tif (key === this._key) {\n\t\t\t\t\tfinalEntries.push([keys, value]);\n\t\t\t\t} else {\n\t\t\t\t\tconst nextKeys = [...keys, key];\n\t\t\t\t\tgetKeys(value, nextKeys);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tgetKeys(this._map);\n\t\treturn new ShimIterator<[any[], T]>(finalEntries);\n\t}\n\n\t/**\n\t * Executes a given function for each map entry. The function\n\t * is invoked with three arguments: the element value, the\n\t * element key, and the associated Map instance.\n\t *\n\t * @param callback The function to execute for each map entry,\n\t * @param context The value to use for `this` for each execution of the calback\n\t */\n\tforEach(callback: (value: T, key: any[], mapInstance: MultiMap<T>) => any, context?: {}): void {\n\t\tconst entries = this.entries();\n\n\t\tfor (const value of entries) {\n\t\t\tcallback.call(context, value[1], value[0], this);\n\t\t}\n\t}\n\n\t/**\n\t * Deletes all keys and their associated values.\n\t */\n\tclear(): void {\n\t\tthis._map.clear();\n\t}\n\n\t[Symbol.iterator](): IterableIterator<[any[], T]> {\n\t\treturn this.entries();\n\t}\n\n\t[Symbol.toStringTag] = 'MultiMap';\n}\n"]}