import { ObjectPool } from './internal/objectPool.js'; import { ResourceHandle } from './ResourceHandle.js'; export type AssetLoader = (key: string) => Promise; export type AssetLoaderImpls> = { [key in keyof Assets]: AssetLoader; }; export class Assets> { private handlePool = new ObjectPool( () => new ResourceHandle(), (h) => h.reset(), ); private handles = new Map(); constructor(private _loaders: AssetLoaderImpls) {} load = ( loader: LoaderName, key: string, ) => { let handle = this.handles.get(this.getKey(loader, key)); if (!handle) { handle = this.handlePool.acquire(); this.handles.set(this.getKey(loader, key), handle); this._loaders[loader](key).then((value: AssetLoader) => handle!.resolve(value), ); } return handle!.promise as Promise; }; immediate = ( loader: LoaderName, key: string, ) => { const handle = this.handles.get(this.getKey(loader, key)); if (!handle) return null; return handle.value as Loaders[LoaderName] | null; }; private getKey = (loader: keyof Loaders | (string & {}), key: string) => `${loader.toString()}:${key}`; }