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.

chore: simplify load/store types in tooltips

Use Simplify<T> and & {} to force TypeScript to eagerly evaluate
mapped types, showing { x: number; y: number } instead of
FieldValues<{ x: Int32; y: Int32 }> in IDE tooltips.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+9 -5
+4 -2
src/shared/shared-struct.ts
··· 4 4 [K in keyof T]: T[K] extends Loadable<any> ? K : never; 5 5 }[keyof T]; 6 6 7 - type FieldValues<T extends Record<string, unknown>> = { 7 + type Simplify<T> = { [K in keyof T]: T[K] } & {}; 8 + 9 + type FieldValues<T extends Record<string, unknown>> = Simplify<{ 8 10 [K in LoadableKeys<T>]: T[K] extends Loadable<infer V> ? V : never; 9 - }; 11 + }>; 10 12 11 13 function isLoadable(value: unknown): value is Loadable<unknown> { 12 14 return (
+5 -3
src/shared/tuple.ts
··· 1 1 import type { Loadable } from './loadable.ts'; 2 2 3 + type TupleValues<T extends Loadable<any>[]> = { [K in keyof T]: T[K] extends Loadable<infer V> ? V : never } & {}; 4 + 3 5 const SHARED = Symbol.for('moroutine.shared'); 4 6 5 - export class Tuple<T extends Loadable<any>[]> implements Loadable<{ [K in keyof T]: T[K] extends Loadable<infer V> ? V : never }> { 7 + export class Tuple<T extends Loadable<any>[]> implements Loadable<TupleValues<T>> { 6 8 private readonly elements: T; 7 9 readonly length: number; 8 10 ··· 18 20 return this.elements[index]; 19 21 } 20 22 21 - load(): { [K in keyof T]: T[K] extends Loadable<infer V> ? V : never } { 23 + load(): TupleValues<T> { 22 24 return this.elements.map((el) => el.load()) as any; 23 25 } 24 26 25 - store(values: { [K in keyof T]: T[K] extends Loadable<infer V> ? V : never }): void { 27 + store(values: TupleValues<T>): void { 26 28 for (let i = 0; i < this.elements.length; i++) { 27 29 this.elements[i].store((values as any)[i]); 28 30 }