import "../_dnt.polyfills.js"; export interface MapLike { set(key: K, value: V): void get(key: K): undefined | V } export function getOrInit( container: MapLike, key: K, init: () => V, ): V { let value = container.get(key) if (value === undefined) { value = init() container.set(key, value) } return value } export class WeakRefMap { map = new Map>() finReg = new FinalizationRegistry((key) => this.map.delete(key)) get(key: K) { return this.map.get(key)?.deref() } set(key: K, value: V) { this.map.set(key, new WeakRef(value)) this.finReg.register(value, key, value) } delete(key: K) { const value = this.get(key) if (!value) return false this.map.delete(key) this.finReg.unregister(value) return true } }