diff --git a/src/mol-util/map.ts b/src/mol-util/map.ts new file mode 100644 index 0000000000000000000000000000000000000000..42c2589077afe4493ec9024721b844573bc42520 --- /dev/null +++ b/src/mol-util/map.ts @@ -0,0 +1,37 @@ +/** + * 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 +// } +// } \ No newline at end of file