export type IndexedType = Map export function findEntry(map: Map, predicate: (value: V) => unknown): [K, V] | undefined { for (const entry of map) { if (predicate(entry[1])) { return entry } } return undefined } export function find(map: Map, predicate: (value: V) => boolean | undefined): V | undefined { for (const entry of map) { if (predicate(entry[1])) { return entry[1] } } return undefined } export function filter(map: Map, predicate: (value: V) => boolean | undefined): Map { const result: Map = new Map() for (const entry of map) { if (predicate(entry[1])) { result.set(entry[0], entry[1]) } } return result } export function isEmpty(map: Map): boolean { return size(map) === 0 } export function sortValues(map: Map, compare: (a: V, b: V) => number): Map { return new Map([...map.entries()].sort((a, b) => compare(a[1], b[1]))) } export function iterable(map: Map): Iterable<[K, V]> { return map } export function values(map: Map): Iterable { return map.values() } export function remove(map: Map, key: K): void { map.delete(key) } export function create(): Map export function create(entries: [K, V][]): Map export function create(source: Map): Map export function create(entries?: [K, V][] | Map): Map { if (!entries) { return new Map() } else if (Array.isArray(entries)) { return new Map(entries) } else if (entries instanceof Map) { return new Map(entries) } else { throw new Error(`Unsupported argument to create: ${typeof entries}`) } } export function set(map: Map, key: K, value: O): void { map.set(key, value) } export function get(map: Map, key: K): V | undefined { return map.get(key) } export function has(map: Map, key: K): boolean { return map.has(key) } export function allKeys(map: Map): K[] { return [...map.keys()] } export function allValues(map: Map): V[] { return [...map.values()] } export function size(map: Map): number { return map.size } export function merge(map: Map, other: Map): Map { for (const entry of other) { map.set(entry[0], entry[1]) } return map } export function undefinedIfEmpty(map: Map | undefined): Map | undefined { if (!map) { return undefined } if (isEmpty(map)) { return undefined } return map } export function nullIfEmpty(map: Map | null): Map | null { if (!map) { return null } if (isEmpty(map)) { return null } return map }