import { IAbstraction } from '../library/IAbstraction'; import { IAbstractionPool } from '../library/IAbstractionPool'; import { IAsset } from '../library/IAsset'; export class AbstractionSet { private __finalizer: FinalizationRegistry; private _abstractions: Record = {}; public get finalizer(): FinalizationRegistry { return this.__finalizer || (this.__finalizer = new FinalizationRegistry((id: number) => { const abstraction = this._abstractions[id]; if (abstraction) { // check abstraction hasn't already been cleared abstraction.onClear(); } })); } constructor( public readonly pool: IAbstractionPool ) {} public forEach(callback: (asset: IAsset) => void): void { for (const key in this._abstractions) callback( this._abstractions[key]); } public getAbstraction (asset: IAsset): T { return this._abstractions[asset.id] || (this._abstractions[asset.id] = this.getNewAbstraction(asset)); } public checkAbstraction (asset: IAsset): T { return this._abstractions[asset.id]; } public clearAbstraction(id: number, assetType: string) { this.pool.storeAbstraction(this._abstractions[id], assetType); delete this._abstractions[id]; } public getNewAbstraction(asset: IAsset): IAbstraction { const abstraction: IAbstraction = this.pool.requestAbstraction(asset); abstraction.init(asset, this.pool); return abstraction; } }