Offload functions to worker threads with shared memory primitives for Node.js.
1import type { Loadable } from './loadable.ts';
2
3type TupleValues<T extends Loadable<any>[]> = { [K in keyof T]: T[K] extends Loadable<infer V> ? V : never } & {};
4
5const SHARED = Symbol.for('moroutine.shared');
6
7/** A fixed-length ordered list of shared-memory values with bulk `load()`/`store()` access. */
8export class Tuple<T extends Loadable<any>[]> implements Loadable<TupleValues<T>> {
9 /** The individual Loadable elements, typed per index. */
10 readonly elements: T;
11 readonly length: number;
12
13 constructor(elements: T) {
14 this.elements = elements;
15 this.length = elements.length;
16 }
17
18 load(): TupleValues<T> {
19 return this.elements.map((el) => el.load()) as any;
20 }
21
22 store(values: TupleValues<T>): void {
23 for (let i = 0; i < this.elements.length; i++) {
24 this.elements[i].store((values as any)[i]);
25 }
26 }
27
28 [SHARED](): { tag: string; elements: unknown[] } {
29 const serializedElements: unknown[] = [];
30 for (const el of this.elements) {
31 if (typeof el === 'object' && el !== null && SHARED in el) {
32 serializedElements.push((el as any)[SHARED]());
33 }
34 }
35 return { tag: 'Tuple', elements: serializedElements };
36 }
37}