-
Alexander Rose authoredAlexander Rose authored
map.ts 1.25 KiB
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
export interface DefaultMap<K, V> extends Map<K, V> {
/** Return the value for `key` when available or the default value otherwise. */
getDefault: (key: K) => V
}
/** A `Map` instance with a `getDefault` method added. */
export function DefaultMap<K, V>(valueCtor: () => V) {
const map = new Map<K, V>() as DefaultMap<K, V>
map.getDefault = (key: K) => {
if (map.has(key)) return map.get(key)!
const value = valueCtor()
map.set(key, value)
return value
}
return map
}
// TODO currently not working, see https://github.com/Microsoft/TypeScript/issues/10853
// /** A `Map` with a `getDefault` method added. */
// export class DefaultMap<K, V> extends Map<K, V> {
// constructor(private valueCtor: () => V, entries?: ReadonlyArray<[K, V]>) {
// super(entries)
// }
// /** Return the value for `key` when available or the default value otherwise. */
// getDefault(key: K) {
// if (this.has(key)) return this.get(key)!
// const value = this.valueCtor()
// this.set(key, value)
// return value
// }
// }