import { TContext } from 'standardized-audio-context'; import { DeLorean, IVehicle } from 'vehicles'; import { IAudioNodeMap } from './interfaces'; import { TAudioNodes } from './types'; export class Registrar { private _audioNodes: WeakMap, Set>>>; private _deLoreans: WeakMap; constructor() { this._audioNodes = new WeakMap(); this._deLoreans = new WeakMap(); } public addAudioNode>(context: T, type: U, node: IAudioNodeMap[U]): void { let audioNodesOfContext = this._audioNodes.get(context); if (audioNodesOfContext === undefined) { audioNodesOfContext = new Map(); this._audioNodes.set(context, audioNodesOfContext); } let audioNodesOfType = audioNodesOfContext.get(type); if (audioNodesOfType === undefined) { audioNodesOfType = new Set(); audioNodesOfContext.set(type, audioNodesOfType); } audioNodesOfType.add(node); } public getAudioNodes>(context: T, type: U): IAudioNodeMap[U][] { const audioNodesOfContext = this._audioNodes.get(context); if (audioNodesOfContext !== undefined && audioNodesOfContext.has(type)) { return Array.from([U]>>audioNodesOfContext.get(type)); } return []; } public getDeLorean(context: T): undefined | DeLorean { return this._deLoreans.get(context); } public getVehicle(context: T): undefined | IVehicle { return this._deLoreans.get(context); } public reset(context: T): void { if (this._audioNodes.has(context)) { this._audioNodes.delete(context); } if (this._deLoreans.has(context)) { (this._deLoreans.get(context)).reset(); this._deLoreans.delete(context); } } public setDeLorean(context: T, deLorean: DeLorean): void { this._deLoreans.set(context, deLorean); } } export const registrar = new Registrar();