|
@@ -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
|
|
|
+// }
|
|
|
+// }
|