| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /** |
| * Polyfill of https://github.com/tc39/proposal-upsert with a subclass. |
| * |
| * TODO: Once the proposal is merged, just replace `MapWithDefault` with `Map` and remove it. |
| **/ |
| export class MapWithDefault<K, V> extends Map<K, V> { |
| getOrInsert(key: K, defaultValue: V): V { |
| if (!this.has(key)) { |
| this.set(key, defaultValue); |
| } |
| |
| return this.get(key) as V; |
| } |
| |
| getOrInsertComputed(key: K, callbackFunction: (key: K) => V): V { |
| if (!this.has(key)) { |
| this.set(key, callbackFunction(key)); |
| } |
| |
| return this.get(key) as V; |
| } |
| } |