import type { MatmulResult } from './types' import type { WorkerRequest, WorkerResponse } from './benchWorker' let worker: Worker | null = null let nextId = 0 const pending = new Map void; reject: (e: Error) => void }>() function getWorker(): Worker { if (!worker) { worker = new Worker(new URL('./benchWorker.ts', import.meta.url), { type: 'module' }) worker.onmessage = (e: MessageEvent) => { const p = pending.get(e.data.id) if (!p) return pending.delete(e.data.id) if ('error' in e.data) p.reject(new Error(e.data.error)) else p.resolve({ ms: e.data.ms, sample: e.data.sample }) } } return worker } export function runInWorker(methodId: string, n: number, seedA: number, seedB: number): Promise { const w = getWorker() const id = nextId++ return new Promise((resolve, reject) => { pending.set(id, { resolve, reject }) w.postMessage({ id, methodId, n, seedA, seedB } satisfies WorkerRequest) }) }