import { Dict } from '../dict'; export class AttrMap { constructor( entries?: Iterable, private readonly KeyMap: new (entries?: Iterable | null) => Dict = WeakMap, private readonly ValueMap: new (entries?: Iterable | null) => Dict = Map ) { if (entries) for (const { 0: c, 1: k, 2: v } of entries) { this.set(c, k, v); } } private readonly memory = new this.KeyMap>(); public get(ctx: C, key: K): V | undefined { return this.memory.get(ctx)?.get(key); } public set(ctx: C, key: K, value: V): this { this.memory.get(ctx)?.set(key, value) || this.memory.set(ctx, new this.ValueMap([[key, value]])); return this; } public has(ctx: C): boolean public has(ctx: C, key: K): boolean public has(ctx: C, key?: K): boolean { return arguments.length < 2 ? this.memory.has(ctx) : this.memory.get(ctx)?.has(key!) ?? false; } public delete(ctx: C): boolean public delete(ctx: C, key: K): boolean public delete(ctx: C, key?: K): boolean { return arguments.length < 2 ? this.memory.delete(ctx) : this.memory.get(ctx)?.delete(key!) ?? false; } }