Offload functions to worker threads with shared memory primitives for Node.js.
8
fork

Configure Feed

Select the types of activity you want to include in your feed.

at e46aca05dbf9a2204886d23f7ae3b34883f4e5c6 37 lines 1.2 kB view raw
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}