Files
2026-07-13 12:29:49 +08:00

4884 lines
184 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Run-fidelity corpus: a subset program that transpiles must not just compile
// to Zig (conformance.test.ts pins that) — it must RUN with byte-identical
// observable behavior to the same source executing as plain TypeScript. Each
// case here runs twice from one source: the node side imports the module
// directly (type stripping; the A/B shape the spike harness proved), the
// native side runs the emitted Zig against the rt kernel, and the two
// transcripts are compared byte for byte.
//
// Canonical value text (both drivers emit exactly this grammar):
// n:<16 hex digits> a number, as its f64 bit pattern (any NaN -> n:nan) —
// bit-comparing sidesteps float formatting and makes
// -0, precision, and rounding corners first-class
// b:true / b:false a boolean
// null a null
// x:<hex bytes> bytes, strings, and literal-union members (tag name)
// [v,v,...] a number array, elementwise
//
// The corpus leans on the JS corners where naive Zig disagrees: NaN through
// comparisons and Math.min/max, signed zeros, Math.round's half-toward-+inf,
// ToInt32 bitwise wrapping, float division/remainder by zero, and null-safe
// optional comparisons. Both halves skip when no zig toolchain is on PATH.
import test from "node:test";
import assert from "node:assert/strict";
import { execFileSync, spawnSync } from "node:child_process";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { transpile, transpileFiles } from "./helpers.ts";
const pkg = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
const hasZig = spawnSync("zig", ["version"], { stdio: "ignore" }).status === 0;
type Arg =
| { readonly t: "i"; readonly v: number }
| { readonly t: "f"; readonly v: number | "nan" | "inf" | "-inf" | "-0" }
| { readonly t: "b"; readonly v: boolean }
| { readonly t: "null" }
| { readonly t: "bytes"; readonly v: readonly number[] }
| { readonly t: "nums"; readonly v: readonly (number | "nan" | "-0")[] }
| { readonly t: "tag"; readonly v: string }
| { readonly t: "str"; readonly v: string };
interface Call {
readonly fn: string;
readonly args: readonly Arg[];
}
interface RunCase {
readonly name: string;
readonly src: string;
/// Additional modules beside the entry (multi-file cores): filename ->
/// source. `src` stays the entry (core.ts); every file lands in the
/// case's own directory, so relative imports spell "./name.ts".
readonly files?: Record<string, string>;
/// Primitive probe calls, spelled identically for both drivers.
readonly calls?: readonly Call[];
/// Custom driver bodies for shapes the call vocabulary cannot spell
/// (dispatch loops over Msg unions, the Cmd effects channel). The node
/// body sees `mod` and pushes formatted lines through `line(tag, value)`;
/// the zig body sees `m` and the `row(tag, value)` helper. Both must emit
/// the same tags in the same order.
readonly node?: string;
readonly zig?: string;
/// Transpile options for the native side (kernel capacities — node has a
/// GC and no arenas, so the same source runs unchanged there; the
/// transcripts must STILL match byte for byte).
readonly options?: import("../src/transpile.ts").TranspileOptions;
}
const i = (v: number): Arg => ({ t: "i", v });
const f = (v: number | "nan" | "inf" | "-inf" | "-0"): Arg => ({ t: "f", v });
const runCorpus: RunCase[] = [
{
name: "optional numeric comparisons are null-safe (null equals only null)",
src: `
export function isZero(cls: number | null): boolean {
return cls === 0;
}
export function nonZero(cls: number | null): boolean {
return cls !== 0;
}
export function label(cls: number | null): number {
return cls === 0 ? 1 : cls !== 0 ? 2 : 3;
}
export function gate(cls: number | null, flag: boolean): boolean {
return flag && cls === 1;
}
export function either(a: number | null, b: number | null): boolean {
return a === b;
}
`,
calls: [
{ fn: "isZero", args: [{ t: "null" }] },
{ fn: "isZero", args: [i(0)] },
{ fn: "isZero", args: [i(1)] },
{ fn: "nonZero", args: [{ t: "null" }] },
{ fn: "nonZero", args: [i(0)] },
{ fn: "nonZero", args: [i(5)] },
{ fn: "label", args: [{ t: "null" }] },
{ fn: "label", args: [i(0)] },
{ fn: "label", args: [i(9)] },
{ fn: "gate", args: [{ t: "null" }, { t: "b", v: true }] },
{ fn: "gate", args: [i(1), { t: "b", v: true }] },
{ fn: "gate", args: [{ t: "null" }, { t: "b", v: false }] },
{ fn: "either", args: [{ t: "null" }, { t: "null" }] },
{ fn: "either", args: [{ t: "null" }, f(2)] },
{ fn: "either", args: [f(2), f(2)] },
{ fn: "either", args: [f(2), f(3)] },
],
},
{
name: "null flows: orelse fusion, nullish fallback, optional guard in a switch arm",
src: `
export type Msg = { readonly kind: "set"; readonly v: number } | { readonly kind: "clear" };
export function find(xs: Uint8Array, want: number): number | null {
for (let idx = 0; idx < xs.length; idx++) {
if (xs[idx] === want) return idx;
}
return null;
}
export function findOrZero(xs: Uint8Array, want: number): number {
const hit = find(xs, want);
if (hit === null) return 0;
return hit;
}
export function fallback(cursor: number | null): number {
return cursor ?? 7;
}
export function apply(sel: number, v: number, prev: number | null): number {
const msg: Msg = sel === 0 ? { kind: "set", v: v } : { kind: "clear" };
switch (msg.kind) {
case "set": return prev === 0 ? msg.v + 100 : msg.v;
case "clear": return prev !== 0 ? 1 : 0;
}
}
`,
calls: [
{ fn: "find", args: [{ t: "bytes", v: [9, 4, 7] }, i(7)] },
{ fn: "find", args: [{ t: "bytes", v: [9, 4, 7] }, i(5)] },
{ fn: "findOrZero", args: [{ t: "bytes", v: [9, 4, 7] }, i(4)] },
{ fn: "findOrZero", args: [{ t: "bytes", v: [] }, i(4)] },
{ fn: "fallback", args: [{ t: "null" }] },
{ fn: "fallback", args: [i(3)] },
{ fn: "apply", args: [i(0), i(5), i(0)] },
{ fn: "apply", args: [i(0), i(5), { t: "null" }] },
{ fn: "apply", args: [i(1), i(5), { t: "null" }] },
{ fn: "apply", args: [i(1), i(5), i(0)] },
{ fn: "apply", args: [i(1), i(5), i(2)] },
],
},
{
name: "orelse fusion over a ternary initializer keeps both arms (parenthesized conditional)",
src: `
export function low(bytes: Uint8Array): number | null {
if (bytes.length === 0) return null;
return bytes[0];
}
export function high(bytes: Uint8Array): number | null {
if (bytes.length < 2) return null;
return bytes[1];
}
export function pick(first: boolean, bytes: Uint8Array): number {
const v = first ? low(bytes) : high(bytes);
if (v === null) return -1;
return v;
}
`,
calls: [
{ fn: "pick", args: [{ t: "b", v: true }, { t: "bytes", v: [9, 4] }] },
{ fn: "pick", args: [{ t: "b", v: false }, { t: "bytes", v: [9, 4] }] },
{ fn: "pick", args: [{ t: "b", v: true }, { t: "bytes", v: [] }] },
{ fn: "pick", args: [{ t: "b", v: false }, { t: "bytes", v: [9] }] },
],
},
{
name: "float arithmetic corners: precision, signed zero, division and remainder by zero",
src: `
export function fadd(a: number, b: number): number {
return a + b;
}
export function fmul(a: number, b: number): number {
return a * b;
}
export function fdiv(a: number, b: number): number {
return a / b;
}
export function fmod(a: number, b: number): number {
return a % b;
}
export function feq(a: number, b: number): boolean {
return a === b;
}
export function flt(a: number, b: number): boolean {
return a < b;
}
export function fge(a: number, b: number): boolean {
return a >= b;
}
export function halfLen(bytes: Uint8Array): number {
return bytes.length / 2;
}
`,
calls: [
{ fn: "fadd", args: [f(0.1), f(0.2)] },
{ fn: "fmul", args: [f(-1), f(0)] },
{ fn: "fmul", args: [f(0.1), f(0.1)] },
{ fn: "fdiv", args: [f(1), f(3)] },
{ fn: "fdiv", args: [f(1), f(0)] },
{ fn: "fdiv", args: [f(-1), f(0)] },
{ fn: "fdiv", args: [f(1), f("-0")] },
{ fn: "fdiv", args: [f(0), f(0)] },
{ fn: "fdiv", args: [f(5), f(2)] },
{ fn: "fmod", args: [f(5.5), f(2)] },
{ fn: "fmod", args: [f(-5.5), f(2)] },
{ fn: "fmod", args: [f(1), f(0)] },
{ fn: "fmod", args: [f("inf"), f(2)] },
{ fn: "fmod", args: [f(3), f("inf")] },
{ fn: "feq", args: [f("nan"), f("nan")] },
{ fn: "feq", args: [f(0), f("-0")] },
{ fn: "flt", args: [f("nan"), f(1)] },
{ fn: "fge", args: [f("nan"), f(1)] },
{ fn: "flt", args: [f("-inf"), f(1)] },
{ fn: "halfLen", args: [{ t: "bytes", v: [1, 2, 3, 4, 5] }] },
{ fn: "halfLen", args: [{ t: "bytes", v: [1, 2, 3] }] },
],
},
{
name: "Math corners: min/max NaN propagation and zero order, round half toward +inf",
src: `
export function lo(a: number, b: number): number {
return Math.min(a, b);
}
export function hi(a: number, b: number): number {
return Math.max(a, b);
}
export function nearest(x: number): number {
return Math.round(x);
}
`,
calls: [
{ fn: "lo", args: [f("nan"), f(1)] },
{ fn: "lo", args: [f(1), f("nan")] },
{ fn: "lo", args: [f(0), f("-0")] },
{ fn: "lo", args: [f("-0"), f(0)] },
{ fn: "lo", args: [f(2), f(3)] },
{ fn: "hi", args: [f(0), f("-0")] },
{ fn: "hi", args: [f("-0"), f("-0")] },
{ fn: "hi", args: [f("nan"), f("-inf")] },
{ fn: "hi", args: [f(2), f(3)] },
{ fn: "nearest", args: [f(0.5)] },
{ fn: "nearest", args: [f(-0.5)] },
{ fn: "nearest", args: [f(2.5)] },
{ fn: "nearest", args: [f(-2.5)] },
{ fn: "nearest", args: [f(0.49999999999999994)] },
{ fn: "nearest", args: [f(-0.4)] },
{ fn: "nearest", args: [f("-0")] },
{ fn: "nearest", args: [f(4503599627370495.5)] },
{ fn: "nearest", args: [f("nan")] },
{ fn: "nearest", args: [f("inf")] },
{ fn: "nearest", args: [f(1.5)] },
],
},
{
name: "bitwise ToInt32: out-of-range and negative operands wrap like the source",
src: `
export function band(a: number, b: number): number {
return a & b;
}
export function bor(a: number, b: number): number {
return a | b;
}
export function bxor(a: number, b: number): number {
return a ^ b;
}
export function bmask(a: number): number {
return a & 255;
}
`,
calls: [
{ fn: "band", args: [i(1099511627776), i(1099511627776)] },
{ fn: "band", args: [i(-1), i(255)] },
{ fn: "bor", args: [i(4294967296), i(1)] },
{ fn: "bor", args: [i(-2), i(1)] },
{ fn: "bxor", args: [i(-1), i(1099511627776)] },
{ fn: "bxor", args: [i(2147483648), i(0)] },
{ fn: "bmask", args: [i(1099511627781)] },
{ fn: "bmask", args: [i(-1)] },
{ fn: "band", args: [i(12), i(10)] },
],
},
{
name: "integer paths: counting loops, byte reads, template holes, remainder indexing",
src: `
import { asciiBytes } from "@native-sdk/core";
export function spaces(bytes: Uint8Array): number {
let n = 0;
for (let idx = 0; idx < bytes.length; idx++) {
if (bytes[idx] === 32) n += 1;
}
return n;
}
export function label(n: number, bytes: Uint8Array): Uint8Array {
const probe = bytes[n];
return asciiBytes(\`item \${n + probe}\`);
}
export function wrapAt(bytes: Uint8Array, at: number): number {
return bytes[at % bytes.length];
}
`,
calls: [
{ fn: "spaces", args: [{ t: "bytes", v: [32, 65, 32, 32, 66] }] },
{ fn: "spaces", args: [{ t: "bytes", v: [] }] },
{ fn: "label", args: [i(1), { t: "bytes", v: [10, 20, 30] }] },
{ fn: "wrapAt", args: [{ t: "bytes", v: [5, 6, 7] }, i(7)] },
{ fn: "wrapAt", args: [{ t: "bytes", v: [5, 6, 7] }, i(2)] },
],
},
{
name: "bytes ops: subarray views, slice copies, set stitching",
src: `
export function tail(bytes: Uint8Array, from: number): Uint8Array {
return bytes.slice(from, bytes.length);
}
export function head(bytes: Uint8Array, upTo: number): Uint8Array {
return bytes.subarray(0, upTo);
}
export function stitch(a: Uint8Array, b: Uint8Array): Uint8Array {
const out = new Uint8Array(a.length + b.length);
out.set(a, 0);
out.set(b, a.length);
return out;
}
`,
calls: [
{ fn: "tail", args: [{ t: "bytes", v: [1, 2, 3, 4] }, i(2)] },
{ fn: "tail", args: [{ t: "bytes", v: [1, 2] }, i(2)] },
{ fn: "head", args: [{ t: "bytes", v: [9, 8, 7] }, i(2)] },
{ fn: "stitch", args: [{ t: "bytes", v: [1, 2] }, { t: "bytes", v: [3] }] },
{ fn: "stitch", args: [{ t: "bytes", v: [] }, { t: "bytes", v: [] }] },
],
},
{
name: "literal unions at runtime: cross-enum equality, optional tags, re-tagging",
src: `
export type Category = "food" | "travel" | "gear";
export type CategoryFilter = "all" | "food" | "travel" | "gear";
export function matches(category: Category, filter: CategoryFilter | null): boolean {
return filter === null || category === filter;
}
export function pick(category: Category, everything: boolean): CategoryFilter {
const filter: CategoryFilter = everything ? "all" : category;
return filter;
}
export function differs(s: Category, b: CategoryFilter): boolean {
return s !== b;
}
export function same(s: Category | null, b: CategoryFilter | null): boolean {
return s === b;
}
`,
calls: [
{ fn: "matches", args: [{ t: "tag", v: "food" }, { t: "null" }] },
{ fn: "matches", args: [{ t: "tag", v: "food" }, { t: "tag", v: "food" }] },
{ fn: "matches", args: [{ t: "tag", v: "food" }, { t: "tag", v: "gear" }] },
{ fn: "matches", args: [{ t: "tag", v: "food" }, { t: "tag", v: "all" }] },
{ fn: "pick", args: [{ t: "tag", v: "travel" }, { t: "b", v: false }] },
{ fn: "pick", args: [{ t: "tag", v: "food" }, { t: "b", v: true }] },
{ fn: "differs", args: [{ t: "tag", v: "food" }, { t: "tag", v: "food" }] },
{ fn: "differs", args: [{ t: "tag", v: "food" }, { t: "tag", v: "all" }] },
{ fn: "same", args: [{ t: "null" }, { t: "null" }] },
{ fn: "same", args: [{ t: "null" }, { t: "tag", v: "food" }] },
{ fn: "same", args: [{ t: "tag", v: "food" }, { t: "null" }] },
{ fn: "same", args: [{ t: "tag", v: "food" }, { t: "tag", v: "food" }] },
{ fn: "same", args: [{ t: "tag", v: "gear" }, { t: "tag", v: "all" }] },
],
},
{
name: "union narrowing through a selector-built value and payload math",
src: `
export type Ev =
| { readonly kind: "insert"; readonly text: Uint8Array }
| { readonly kind: "move"; readonly dx: number; readonly dy: number }
| { readonly kind: "clear" };
export function weigh(sel: number, payload: Uint8Array, dx: number, dy: number): number {
const ev: Ev = sel === 0 ? { kind: "insert", text: payload } : sel === 1 ? { kind: "move", dx: dx, dy: dy } : { kind: "clear" };
switch (ev.kind) {
case "insert": return ev.text.length;
case "move": return ev.dx + ev.dy;
case "clear": return 0;
}
}
`,
calls: [
{ fn: "weigh", args: [i(0), { t: "bytes", v: [1, 2, 3] }, f(0), f(0)] },
{ fn: "weigh", args: [i(1), { t: "bytes", v: [] }, f(2.5), f(-1)] },
{ fn: "weigh", args: [i(2), { t: "bytes", v: [] }, f(0), f(0)] },
],
},
{
name: "number arrays: map/filter lowering keeps float element math",
src: `
export function scaled(xs: readonly number[], k: number): readonly number[] {
return xs.map((x) => x * k);
}
export function bigs(xs: readonly number[], lim: number): readonly number[] {
return xs.filter((x) => x > lim);
}
`,
calls: [
{ fn: "scaled", args: [{ t: "nums", v: [1.5, -2, 0.1] }, f(3)] },
{ fn: "scaled", args: [{ t: "nums", v: [] }, f(2)] },
{ fn: "bigs", args: [{ t: "nums", v: [0.5, 2, -3, 7] }, f(1)] },
{ fn: "bigs", args: [{ t: "nums", v: [0.5] }, f(1)] },
],
},
{
name: "record model dispatch: spread updates, map toggles, filter purges",
src: `
export interface Task { readonly id: number; readonly done: boolean; }
export interface Model { readonly tasks: readonly Task[]; readonly nextId: number; }
export type Msg =
| { readonly kind: "add" }
| { readonly kind: "toggle"; readonly id: number }
| { readonly kind: "purge" };
export function initialModel(): Model {
return { tasks: [], nextId: 1 };
}
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "add":
return { ...model, tasks: [...model.tasks, { id: model.nextId, done: false }], nextId: model.nextId + 1 };
case "toggle":
return { ...model, tasks: model.tasks.map((t) => (t.id === msg.id ? { ...t, done: !t.done } : t)) };
case "purge":
return { ...model, tasks: model.tasks.filter((t) => !t.done) };
}
}
export function doneCount(model: Model): number {
return model.tasks.filter((t) => t.done).length;
}
export function idSum(model: Model): number {
let total = 0;
for (let idx = 0; idx < model.tasks.length; idx++) {
total += model.tasks[idx].id;
}
return total;
}
`,
node: `
{
let model = mod.initialModel();
model = mod.update(model, { kind: "add" });
model = mod.update(model, { kind: "add" });
model = mod.update(model, { kind: "add" });
model = mod.update(model, { kind: "toggle", id: 2 });
line("s0", mod.doneCount(model));
line("s1", mod.idSum(model));
model = mod.update(model, { kind: "purge" });
line("s2", mod.idSum(model));
line("s3", model.nextId);
}
`,
zig: `
{
var model = m.initialModel();
model = m.update(model, .add);
model = m.update(model, .add);
model = m.update(model, .add);
model = m.update(model, .{ .toggle = 2 });
row("s0", m.doneCount(model));
row("s1", m.idSum(model));
model = m.update(model, .purge);
row("s2", m.idSum(model));
row("s3", model.nextId);
}
`,
},
{
name: "Cmd effects channel: encoded command bytes match the SDK factories",
src: `
import { Cmd } from "@native-sdk/core";
export interface Model { readonly count: number; readonly saved: number; }
export type Msg =
| { readonly kind: "add" }
| { readonly kind: "save" }
| { readonly kind: "stamp" }
| { readonly kind: "tick"; readonly at: number };
export function initialModel(): Model {
return { count: 0, saved: 0 };
}
export function update(model: Model, msg: Msg): Model | [Model, Cmd<Msg>] {
switch (msg.kind) {
case "add": return { ...model, count: model.count + 1 };
case "save": return [{ ...model, saved: model.count }, model.count > 2 ? Cmd.persist() : Cmd.none];
case "stamp": return [model, Cmd.batch([Cmd.now("tick"), Cmd.host("beep", model.count, 0.5)])];
case "tick": return { ...model, count: msg.at };
}
}
`,
node: `
{
// Msg arm order, for Cmd.now's declaration-order tag byte.
const kinds = ["add", "save", "stamp", "tick"];
// Mirror of the rt kernel's Cmd wire format v1 (rt.zig): flat op records,
// batch = concatenation, args as f64 little-endian.
const enc = (cmd) => {
if (cmd.op === "none") return [];
if (cmd.op === "persist") return [1];
if (cmd.op === "now") return [2, kinds.indexOf(cmd.msgKind)];
if (cmd.op === "host") {
const name = Array.from(new TextEncoder().encode(cmd.name));
const bytes = [3, name.length, ...name, cmd.args.length];
for (const a of cmd.args) {
const dv = new DataView(new ArrayBuffer(8));
dv.setFloat64(0, a, true);
for (let idx = 0; idx < 8; idx++) bytes.push(dv.getUint8(idx));
}
return bytes;
}
return cmd.cmds.flatMap(enc);
};
const step = (model, msg) => {
const r = mod.update(model, msg);
return Array.isArray(r) ? [r[0], Uint8Array.from(enc(r[1]))] : [r, Uint8Array.from([])];
};
let model = mod.initialModel();
let cmd;
[model, cmd] = step(model, { kind: "add" });
line("e0m", model.count);
line("e0c", cmd);
[model, cmd] = step(model, { kind: "save" });
line("e1s", model.saved);
line("e1c", cmd);
[model, cmd] = step(model, { kind: "add" });
[model, cmd] = step(model, { kind: "add" });
[model, cmd] = step(model, { kind: "save" });
line("e2s", model.saved);
line("e2c", cmd);
[model, cmd] = step(model, { kind: "stamp" });
line("e3c", cmd);
[model, cmd] = step(model, { kind: "tick", at: 41 });
line("e4m", model.count);
line("e4c", cmd);
}
`,
zig: `
{
var model = m.initialModel();
var r = m.update(model, .add);
model = r.model;
row("e0m", model.count);
row("e0c", r.cmd);
r = m.update(model, .save);
model = r.model;
row("e1s", model.saved);
row("e1c", r.cmd);
r = m.update(model, .add);
model = r.model;
r = m.update(model, .add);
model = r.model;
r = m.update(model, .save);
model = r.model;
row("e2s", model.saved);
row("e2c", r.cmd);
r = m.update(model, .stamp);
model = r.model;
row("e3c", r.cmd);
r = m.update(model, .{ .tick = 41 });
model = r.model;
row("e4m", model.count);
row("e4c", r.cmd);
}
`,
},
{
name: "optional chains: short-circuit and present-value paths behave identically",
src: `
export interface Sel { readonly at: number; readonly len: number; }
export interface Model { readonly sel: Sel | null; readonly fallback: number; }
export type Msg =
| { readonly kind: "pick"; readonly at: number; readonly len: number }
| { readonly kind: "clear" };
export function initialModel(): Model {
return { sel: null, fallback: 7 };
}
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "pick": return { ...model, sel: { at: msg.at, len: msg.len } };
case "clear": return { ...model, sel: null };
}
}
export function selEnd(model: Model): number {
return (model.sel?.at ?? -1) + (model.sel?.len ?? 0);
}
export function hasWide(model: Model): boolean {
return (model.sel?.len ?? 0) > 2;
}
export function pickedAtFour(model: Model): number {
if (model.sel?.at === 4) return 1;
return 0;
}
export function atOrFallback(model: Model): number {
return model.sel?.at ?? model.fallback;
}
`,
node: `
{
let model = mod.initialModel();
line("q0", mod.selEnd(model));
line("q1", mod.hasWide(model));
line("q2", mod.pickedAtFour(model));
line("q3", mod.atOrFallback(model));
model = mod.update(model, { kind: "pick", at: 4, len: 3 });
line("q4", mod.selEnd(model));
line("q5", mod.hasWide(model));
line("q6", mod.pickedAtFour(model));
line("q7", mod.atOrFallback(model));
model = mod.update(model, { kind: "clear" });
line("q8", mod.selEnd(model));
}
`,
zig: `
{
var model = m.initialModel();
row("q0", m.selEnd(model));
row("q1", m.hasWide(model));
row("q2", m.pickedAtFour(model));
row("q3", m.atOrFallback(model));
model = m.update(model, .{ .pick = .{ .at = 4, .len = 3 } });
row("q4", m.selEnd(model));
row("q5", m.hasWide(model));
row("q6", m.pickedAtFour(model));
row("q7", m.atOrFallback(model));
model = m.update(model, .clear);
row("q8", m.selEnd(model));
}
`,
},
{
name: "string equality: content comparison, null table, tag-name against string",
src: `
export type Filter = "all" | "active" | "done";
export function commandCode(name: string): number {
if (name === "app.add") return 1;
if (name !== "app.remove") return 0;
return 2;
}
export function sameName(a: string, b: string): boolean {
return a === b;
}
export function pick(name: string | null): number {
if (name === "left") return 1;
if (name !== "right") return 2;
return 3;
}
export function matchesName(f: Filter, name: string): boolean {
return f === name;
}
`,
calls: [
{ fn: "commandCode", args: [{ t: "str", v: "app.add" }] },
{ fn: "commandCode", args: [{ t: "str", v: "app.remove" }] },
{ fn: "commandCode", args: [{ t: "str", v: "other" }] },
{ fn: "commandCode", args: [{ t: "str", v: "" }] },
{ fn: "sameName", args: [{ t: "str", v: "a" }, { t: "str", v: "a" }] },
{ fn: "sameName", args: [{ t: "str", v: "a" }, { t: "str", v: "b" }] },
{ fn: "sameName", args: [{ t: "str", v: "" }, { t: "str", v: "" }] },
{ fn: "pick", args: [{ t: "null" }] },
{ fn: "pick", args: [{ t: "str", v: "left" }] },
{ fn: "pick", args: [{ t: "str", v: "right" }] },
{ fn: "pick", args: [{ t: "str", v: "middle" }] },
{ fn: "matchesName", args: [{ t: "tag", v: "all" }, { t: "str", v: "all" }] },
{ fn: "matchesName", args: [{ t: "tag", v: "done" }, { t: "str", v: "all" }] },
{ fn: "matchesName", args: [{ t: "tag", v: "active" }, { t: "str", v: "activex" }] },
],
},
{
name: "for...of: sums with break and continue over bytes and number arrays",
src: `
export function sumBytes(bytes: Uint8Array, stop: number): number {
let total = 0;
for (const b of bytes) {
if (b === stop) break;
if (b === 0) continue;
total += b;
}
return total;
}
export function product(xs: readonly number[]): number {
let p = 1;
for (const x of xs) {
p = p * x;
}
return p;
}
`,
calls: [
{ fn: "sumBytes", args: [{ t: "bytes", v: [1, 0, 2, 9, 5] }, i(9)] },
{ fn: "sumBytes", args: [{ t: "bytes", v: [] }, i(9)] },
{ fn: "sumBytes", args: [{ t: "bytes", v: [3, 0, 4] }, i(9)] },
{ fn: "product", args: [{ t: "nums", v: [1.5, -2, 0.1] }] },
{ fn: "product", args: [{ t: "nums", v: [] }] },
],
},
{
name: "predicate scans: find/findIndex/some/every hits, misses, and empties",
src: `
export function firstOver(xs: readonly number[], lim: number): number {
return xs.find((x) => x > lim) ?? -1;
}
export function overAt(xs: readonly number[], lim: number): number {
return xs.findIndex((x) => x > lim);
}
export function anyOver(xs: readonly number[], lim: number): boolean {
return xs.some((x) => x > lim);
}
export function allOver(xs: readonly number[], lim: number): boolean {
return xs.every((x) => x > lim);
}
export function tenfoldHit(xs: readonly number[], lim: number): number {
const hit = xs.find((x) => x > lim);
if (hit === undefined) return -1;
return hit * 10;
}
`,
calls: [
{ fn: "firstOver", args: [{ t: "nums", v: [0.5, 2, -3, 7] }, f(1)] },
{ fn: "firstOver", args: [{ t: "nums", v: [0.5] }, f(1)] },
{ fn: "firstOver", args: [{ t: "nums", v: [] }, f(1)] },
{ fn: "firstOver", args: [{ t: "nums", v: ["nan", 4] }, f(1)] },
{ fn: "overAt", args: [{ t: "nums", v: [0.5, 2, -3, 7] }, f(1)] },
{ fn: "overAt", args: [{ t: "nums", v: [0.5] }, f(9)] },
{ fn: "anyOver", args: [{ t: "nums", v: [0.5, 2] }, f(1)] },
{ fn: "anyOver", args: [{ t: "nums", v: [] }, f(1)] },
{ fn: "allOver", args: [{ t: "nums", v: [2, 3] }, f(1)] },
{ fn: "allOver", args: [{ t: "nums", v: [2, 0.5] }, f(1)] },
{ fn: "allOver", args: [{ t: "nums", v: [] }, f(1)] },
{ fn: "tenfoldHit", args: [{ t: "nums", v: [0.5, 2] }, f(1)] },
{ fn: "tenfoldHit", args: [{ t: "nums", v: [0.5] }, f(1)] },
],
},
{
name: "mixed-class optional equality widens null-safely; miss-first ternaries narrow",
src: `
export interface Entry { readonly at: number; }
const ENTRIES: readonly Entry[] = [{ at: 0 }, { at: 2 }, { at: 7 }];
export function pickOrFlag(bytes: Uint8Array, key: number, frac: number): number {
const hit = ENTRIES.find((e) => e.at === key);
const sel = hit === undefined ? null : hit.at;
const half = frac * 0.5;
if (sel === half) return -1;
if (sel !== null && sel < bytes.length) return bytes[sel];
return -2;
}
export function offHalf(sel: number | null, frac: number): boolean {
const half = frac * 0.5;
return sel !== half;
}
export function missTernary(xs: readonly number[], lim: number): number {
const hit = xs.find((x) => x > lim);
return hit === undefined ? -1 : hit * 2;
}
export function selTernary(sel: number | null): number {
return sel === null ? 0 : sel + 1;
}
`,
calls: [
// sel is an INTERNAL optional integer slot (table id through a find
// miss-ternary, index-demanded); half is float: the 2 === 2.0 hit
// must agree with node through the null-safe widening.
{ fn: "pickOrFlag", args: [{ t: "bytes", v: [5, 6, 7] }, f(2), f(4)] },
{ fn: "pickOrFlag", args: [{ t: "bytes", v: [5, 6, 7] }, f(0), f(5)] },
{ fn: "pickOrFlag", args: [{ t: "bytes", v: [5, 6, 7] }, f(9), f(4)] },
{ fn: "pickOrFlag", args: [{ t: "bytes", v: [] }, f(7), f(1)] },
{ fn: "offHalf", args: [{ t: "null" }, f(0)] },
{ fn: "offHalf", args: [{ t: "null" }, f("nan")] },
{ fn: "missTernary", args: [{ t: "nums", v: [0.5, 2] }, f(1)] },
{ fn: "missTernary", args: [{ t: "nums", v: [0.5] }, f(1)] },
{ fn: "selTernary", args: [{ t: "null" }] },
{ fn: "selTernary", args: [f(4.5)] },
],
},
{
name: "reduce: float accumulation, seeds, and the empty-array initial",
src: `
export function total(xs: readonly number[]): number {
return xs.reduce((sum, x) => sum + x, 0);
}
export function totalFrom(xs: readonly number[], seed: number): number {
return xs.reduce((sum, x) => sum + x, seed);
}
export function countBig(xs: readonly number[], lim: number): number {
return xs.reduce((n, x) => (x > lim ? n + 1 : n), 0);
}
`,
calls: [
{ fn: "total", args: [{ t: "nums", v: [0.1, 0.2] }] },
{ fn: "total", args: [{ t: "nums", v: [] }] },
{ fn: "total", args: [{ t: "nums", v: [1, 2, 3] }] },
{ fn: "totalFrom", args: [{ t: "nums", v: [1, 2] }, f(0.5)] },
{ fn: "totalFrom", args: [{ t: "nums", v: [] }, f("-0")] },
{ fn: "countBig", args: [{ t: "nums", v: [0.5, 2, -3, 7] }, f(1)] },
],
},
{
name: "slice and concat: negative, clamped, and crossed indices copy like JS",
src: `
export function sliced(xs: readonly number[], from: number, to: number): readonly number[] {
return xs.slice(from, to);
}
export function tailFrom(xs: readonly number[], from: number): readonly number[] {
return xs.slice(from);
}
export function wholeCopy(xs: readonly number[]): readonly number[] {
return xs.slice();
}
export function stitched(a: readonly number[], b: readonly number[]): readonly number[] {
return a.concat(b);
}
`,
calls: [
{ fn: "sliced", args: [{ t: "nums", v: [1, 2, 3] }, i(-2), i(99)] },
{ fn: "sliced", args: [{ t: "nums", v: [1, 2, 3] }, i(1), i(-1)] },
{ fn: "sliced", args: [{ t: "nums", v: [1, 2, 3] }, i(2), i(1)] },
{ fn: "sliced", args: [{ t: "nums", v: [1, 2, 3] }, i(5), i(9)] },
{ fn: "sliced", args: [{ t: "nums", v: [1, 2, 3] }, i(0), i(99)] },
{ fn: "tailFrom", args: [{ t: "nums", v: [1, 2, 3] }, i(-99)] },
{ fn: "tailFrom", args: [{ t: "nums", v: [1, 2, 3] }, i(2)] },
{ fn: "wholeCopy", args: [{ t: "nums", v: [0.5, -0.5] }] },
{ fn: "wholeCopy", args: [{ t: "nums", v: [] }] },
{ fn: "stitched", args: [{ t: "nums", v: [1] }, { t: "nums", v: [2, 3] }] },
{ fn: "stitched", args: [{ t: "nums", v: [] }, { t: "nums", v: [] }] },
],
},
{
name: "indexOf and includes: strict equality vs SameValueZero (NaN, signed zero)",
src: `
export function whereIs(xs: readonly number[], v: number): number {
return xs.indexOf(v);
}
export function has(xs: readonly number[], v: number): boolean {
return xs.includes(v);
}
`,
calls: [
{ fn: "whereIs", args: [{ t: "nums", v: [1, "nan", 3] }, f("nan")] },
{ fn: "has", args: [{ t: "nums", v: [1, "nan", 3] }, f("nan")] },
{ fn: "whereIs", args: [{ t: "nums", v: [0] }, f("-0")] },
{ fn: "has", args: [{ t: "nums", v: [0] }, f("-0")] },
{ fn: "whereIs", args: [{ t: "nums", v: ["-0"] }, f(0)] },
{ fn: "whereIs", args: [{ t: "nums", v: [5, 6, 7] }, f(6)] },
{ fn: "whereIs", args: [{ t: "nums", v: [5] }, f(9)] },
{ fn: "has", args: [{ t: "nums", v: [] }, f(1)] },
],
},
{
name: "bytes join: separators fold, empties and single elements match JS ToString",
src: `
export function dashed(bytes: Uint8Array): string {
return bytes.join("-");
}
export function commas(bytes: Uint8Array): string {
return bytes.join();
}
export function bare(bytes: Uint8Array): string {
return bytes.join("");
}
`,
calls: [
{ fn: "dashed", args: [{ t: "bytes", v: [1, 255, 0] }] },
{ fn: "dashed", args: [{ t: "bytes", v: [] }] },
{ fn: "dashed", args: [{ t: "bytes", v: [9] }] },
{ fn: "commas", args: [{ t: "bytes", v: [1, 2] }] },
{ fn: "bare", args: [{ t: "bytes", v: [1, 2, 3] }] },
],
},
{
name: "record model dispatch through the scan and copy methods",
src: `
export interface Task { readonly id: number; readonly done: boolean; }
export interface Model { readonly tasks: readonly Task[]; readonly nextId: number; }
export type Msg =
| { readonly kind: "add" }
| { readonly kind: "toggle"; readonly id: number };
export function initialModel(): Model {
return { tasks: [], nextId: 1 };
}
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "add":
return { ...model, tasks: [...model.tasks, { id: model.nextId, done: false }], nextId: model.nextId + 1 };
case "toggle":
return { ...model, tasks: model.tasks.map((t) => (t.id === msg.id ? { ...t, done: !t.done } : t)) };
}
}
export function firstDoneId(model: Model): number {
const hit = model.tasks.find((t) => t.done);
if (hit === undefined) return -1;
return hit.id;
}
export function doneAt(model: Model): number {
return model.tasks.findIndex((t) => t.done);
}
export function anyDone(model: Model): boolean {
return model.tasks.some((t) => t.done);
}
export function allDone(model: Model): boolean {
return model.tasks.every((t) => t.done);
}
export function idTotal(model: Model): number {
return model.tasks.reduce((sum, t) => sum + t.id, 0);
}
export function keptCount(model: Model): number {
return model.tasks.slice(0, 2).length;
}
`,
node: `
{
let model = mod.initialModel();
line("g0", mod.firstDoneId(model));
line("g1", mod.anyDone(model));
line("g2", mod.allDone(model));
model = mod.update(model, { kind: "add" });
model = mod.update(model, { kind: "add" });
model = mod.update(model, { kind: "add" });
model = mod.update(model, { kind: "toggle", id: 2 });
line("g3", mod.firstDoneId(model));
line("g4", mod.doneAt(model));
line("g5", mod.anyDone(model));
line("g6", mod.allDone(model));
line("g7", mod.idTotal(model));
line("g8", mod.keptCount(model));
}
`,
zig: `
{
var model = m.initialModel();
row("g0", m.firstDoneId(model));
row("g1", m.anyDone(model));
row("g2", m.allDone(model));
model = m.update(model, .add);
model = m.update(model, .add);
model = m.update(model, .add);
model = m.update(model, .{ .toggle = 2 });
row("g3", m.firstDoneId(model));
row("g4", m.doneAt(model));
row("g5", m.anyDone(model));
row("g6", m.allDone(model));
row("g7", m.idTotal(model));
row("g8", m.keptCount(model));
}
`,
},
{
name: "toSorted: sign comparators over floats, duplicates, signed zeros, and empties",
src: `
export function asc(xs: readonly number[]): readonly number[] {
return xs.toSorted((a, b) => a - b);
}
export function desc(xs: readonly number[]): readonly number[] {
return xs.toSorted((a, b) => b - a);
}
export function keepOrder(xs: readonly number[]): readonly number[] {
return xs.toSorted((a, b) => 0);
}
export function fractional(xs: readonly number[]): readonly number[] {
return xs.toSorted((a, b) => (a - b) * 0.5);
}
`,
calls: [
{ fn: "asc", args: [{ t: "nums", v: [3, 1, 2, 1, 3, 0.5] }] },
{ fn: "asc", args: [{ t: "nums", v: [0, "-0", 0] }] },
{ fn: "asc", args: [{ t: "nums", v: [] }] },
{ fn: "asc", args: [{ t: "nums", v: [5] }] },
{ fn: "asc", args: [{ t: "nums", v: [2, -1, "-0", 7, -1] }] },
{ fn: "desc", args: [{ t: "nums", v: [3, 1, 2, 1, 3] }] },
{ fn: "desc", args: [{ t: "nums", v: [0.25, 0.5, 0.125] }] },
{ fn: "keepOrder", args: [{ t: "nums", v: [3, 1, 2] }] },
{ fn: "fractional", args: [{ t: "nums", v: [3, 1, 2, 1] }] },
],
},
{
name: "toSorted stability: equal-key records keep declaration order, byte for byte",
src: `
export interface Task { readonly id: number; readonly streak: number; }
export interface Model { readonly tasks: readonly Task[]; readonly nextId: number; }
export type Msg = { readonly kind: "seed"; readonly streak: number } | { readonly kind: "noop" };
export function initialModel(): Model {
return { tasks: [], nextId: 1 };
}
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "seed":
return { tasks: [...model.tasks, { id: model.nextId, streak: msg.streak }], nextId: model.nextId + 1 };
case "noop": return model;
}
}
export function sortedIds(model: Model): readonly number[] {
const out: number[] = [];
for (const t of model.tasks.toSorted((a, b) => a.streak - b.streak)) {
out.push(t.id);
}
return out;
}
export function groupedIds(model: Model): readonly number[] {
const out: number[] = [];
for (const t of model.tasks.toSorted((a, b) => {
if (a.streak === b.streak) return 0;
return b.streak - a.streak;
})) {
out.push(t.id);
}
return out;
}
`,
node: `
{
let model = mod.initialModel();
for (const s of [2, 1, 2, 1, 2, 0]) model = mod.update(model, { kind: "seed", streak: s });
line("t0", mod.sortedIds(model));
line("t1", mod.groupedIds(model));
line("t2", mod.sortedIds(mod.initialModel()));
}
`,
zig: `
{
var model = m.initialModel();
for ([_]f64{ 2, 1, 2, 1, 2, 0 }) |s| model = m.update(model, .{ .seed = s });
row("t0", m.sortedIds(model));
row("t1", m.groupedIds(model));
row("t2", m.sortedIds(m.initialModel()));
}
`,
},
{
name: "push-builder: growth past the seed capacity, conditional pushes, prefix reads",
src: `
export function keptDoubled(xs: readonly number[], lim: number): readonly number[] {
const out: number[] = [];
for (const x of xs) {
if (x > lim) {
out.push(x * 2);
} else if (x === lim) {
out.push(x);
}
}
return out;
}
export function countdown(n: number): readonly number[] {
const out: number[] = [];
let left = n;
while (left > 0) {
out.push(left);
left -= 1;
}
return out;
}
export function firstOrMinusOne(xs: readonly number[], lim: number): number {
const out: number[] = [];
for (const x of xs) {
if (x > lim) out.push(x);
}
if (out.length === 0) return -1;
return out[0];
}
`,
calls: [
{ fn: "keptDoubled", args: [{ t: "nums", v: [1, 5, 3, 5, 9, 0.5] }, f(3)] },
{ fn: "keptDoubled", args: [{ t: "nums", v: [] }, f(3)] },
{ fn: "keptDoubled", args: [{ t: "nums", v: [1, 2] }, f(9)] },
{ fn: "countdown", args: [i(10)] },
{ fn: "countdown", args: [i(0)] },
{ fn: "firstOrMinusOne", args: [{ t: "nums", v: [1, 7, 9] }, f(5)] },
{ fn: "firstOrMinusOne", args: [{ t: "nums", v: [1] }, f(5)] },
],
},
{
name: "local mutation: a push/pop parser-stack helper is byte-identical to node",
src: `
export function maxDepth(bytes: Uint8Array): number {
const stack: number[] = [];
let max = 0;
for (const b of bytes) {
if (b === 40) stack.push(b);
if (b === 41) stack.pop();
if (stack.length > max) max = stack.length;
}
return max;
}
export function balance(bytes: Uint8Array): number {
const stack: number[] = [];
for (const b of bytes) {
if (b === 40 || b === 91) stack.push(b);
if (b === 41 || b === 93) {
const open = stack.pop();
if (open === undefined) return -1;
if (b === 41 && open !== 40) return -2;
if (b === 93 && open !== 91) return -2;
}
}
return stack.length;
}
`,
calls: [
// "(()(()))" nests to 3; "(]" mismatches; ")" underflows (pop on empty).
{ fn: "maxDepth", args: [{ t: "bytes", v: [40, 40, 41, 40, 40, 41, 41, 41] }] },
{ fn: "maxDepth", args: [{ t: "bytes", v: [] }] },
{ fn: "maxDepth", args: [{ t: "bytes", v: [41, 41, 40] }] },
{ fn: "balance", args: [{ t: "bytes", v: [40, 91, 93, 41] }] },
{ fn: "balance", args: [{ t: "bytes", v: [40, 93] }] },
{ fn: "balance", args: [{ t: "bytes", v: [41] }] },
{ fn: "balance", args: [{ t: "bytes", v: [40, 40] }] },
],
},
{
name: "local mutation: splice corners (negative start, over-delete, insert-larger, past-end)",
src: `
export function cutAt(xs: readonly number[], start: number, count: number): readonly number[] {
const work = xs.slice();
const removed = work.splice(start, count);
return removed.concat([-99], work);
}
export function cutRest(xs: readonly number[], start: number): readonly number[] {
const work = xs.slice();
const removed = work.splice(start);
return removed.concat([-99], work);
}
export function inject(xs: readonly number[], start: number, count: number): readonly number[] {
const work = xs.slice();
const removed = work.splice(start, count, 91, 92, 93);
return removed.concat([-99], work);
}
`,
calls: [
{ fn: "cutAt", args: [{ t: "nums", v: [1, 2, 3, 4, 5] }, i(-2), i(1)] },
{ fn: "cutAt", args: [{ t: "nums", v: [1, 2, 3] }, i(1), i(99)] },
{ fn: "cutAt", args: [{ t: "nums", v: [1, 2, 3] }, i(1), i(-5)] },
{ fn: "cutAt", args: [{ t: "nums", v: [1, 2, 3] }, i(99), i(1)] },
{ fn: "cutAt", args: [{ t: "nums", v: [] }, i(0), i(1)] },
{ fn: "cutRest", args: [{ t: "nums", v: [1, 2, 3] }, i(1)] },
{ fn: "cutRest", args: [{ t: "nums", v: [1, 2, 3] }, i(-1)] },
{ fn: "inject", args: [{ t: "nums", v: [1, 2, 3] }, i(1), i(1)] },
{ fn: "inject", args: [{ t: "nums", v: [1, 2, 3] }, i(0), i(0)] },
{ fn: "inject", args: [{ t: "nums", v: [1, 2] }, i(99), i(1)] },
{ fn: "inject", args: [{ t: "nums", v: [] }, i(-3), i(2)] },
],
},
{
name: "local mutation: shift/unshift ordering and their growth past the seed capacity",
src: `
export function rotate(xs: readonly number[]): readonly number[] {
const q = xs.slice();
const head = q.shift();
if (head === undefined) return q;
q.push(head);
q.unshift(-1, -2);
return q;
}
export function frontLoad(n: number): readonly number[] {
const q: number[] = [];
for (let i = 0; i < n; i++) q.unshift(i);
return q;
}
`,
calls: [
{ fn: "rotate", args: [{ t: "nums", v: [1, 2, 3] }] },
{ fn: "rotate", args: [{ t: "nums", v: [7] }] },
{ fn: "rotate", args: [{ t: "nums", v: [] }] },
{ fn: "frontLoad", args: [i(10)] },
{ fn: "frontLoad", args: [i(0)] },
],
},
{
name: "local mutation: in-place sort is stable and equals toSorted, byte for byte",
src: `
export interface Rec { readonly key: number; readonly seq: number; }
export function stableIds(keys: readonly number[]): readonly number[] {
const recs: Rec[] = [];
for (let i = 0; i < keys.length; i++) recs.push({ key: keys[i], seq: i });
recs.sort((a, b) => a.key - b.key);
return recs.map((r) => r.seq);
}
export function sortedBoth(xs: readonly number[]): readonly number[] {
const inPlace = xs.slice();
inPlace.sort((a, b) => a - b);
const copied = xs.toSorted((a, b) => a - b);
return inPlace.concat([-99], copied);
}
`,
calls: [
{ fn: "stableIds", args: [{ t: "nums", v: [2, 1, 2, 1, 1] }] },
{ fn: "stableIds", args: [{ t: "nums", v: [] }] },
{ fn: "sortedBoth", args: [{ t: "nums", v: [3, 1, 2, 1] }] },
{ fn: "sortedBoth", args: [{ t: "nums", v: [1, "-0", 0, 0.5] }] },
{ fn: "sortedBoth", args: [{ t: "nums", v: [] }] },
],
},
{
name: "local mutation: pop on empty flows through the optional machinery",
src: `
export function drainSum(xs: readonly number[], extraPops: number): number {
const work = xs.slice();
let total = 0;
while (work.length > 0) {
total += work.pop() ?? 0;
}
for (let i = 0; i < extraPops; i++) {
const gone = work.pop();
if (gone !== undefined) return -1;
}
return total + work.length;
}
export function lastOr(xs: readonly number[], fallback: number): number {
const work = xs.slice();
return work.pop() ?? fallback;
}
`,
calls: [
{ fn: "drainSum", args: [{ t: "nums", v: [1, 2, 3.5] }, i(2)] },
{ fn: "drainSum", args: [{ t: "nums", v: [] }, i(3)] },
{ fn: "lastOr", args: [{ t: "nums", v: [1, 9] }, f(-1)] },
{ fn: "lastOr", args: [{ t: "nums", v: [] }, f(-1)] },
],
},
{
name: "local mutation: interleaved mutation and reads (length, elements, fill, reverse, writes)",
src: `
export function churn(xs: readonly number[], lim: number): readonly number[] {
const work = xs.slice();
work.push(lim);
if (work.length > 3) work.splice(0, work.length - 3);
work.reverse();
work.fill(0, 1, -1);
if (work.length > 0) work[0] = work[work.length - 1] + work.length;
work.unshift(work.length);
const dropped = work.pop();
if (dropped === undefined) return work;
work.push(dropped * 2);
return work;
}
export function pushSelfRef(xs: readonly number[]): readonly number[] {
const out: number[] = [];
out.push(7);
// JS evaluates both arguments before the first append: both read len 1.
out.push(out.length, out.length);
return out;
}
export function writeDuringForOf(xs: readonly number[]): readonly number[] {
const work = xs.slice();
const seen: number[] = [];
for (const x of work) {
seen.push(x);
if (work.length > 2) work[2] = 99;
}
return seen.concat([-99], work);
}
`,
calls: [
{ fn: "churn", args: [{ t: "nums", v: [1, 2, 3, 4, 5] }, f(6)] },
{ fn: "churn", args: [{ t: "nums", v: [] }, f(1)] },
{ fn: "churn", args: [{ t: "nums", v: [2] }, f(0.5)] },
{ fn: "pushSelfRef", args: [{ t: "nums", v: [] }] },
{ fn: "writeDuringForOf", args: [{ t: "nums", v: [1, 2, 3, 4] }] },
{ fn: "writeDuringForOf", args: [{ t: "nums", v: [1] }] },
],
},
{
name: "prepend and multi-spread literals copy every segment in order",
src: `
export function pre(xs: readonly number[], x: number): readonly number[] {
return [x, ...xs];
}
export function stitch(a: readonly number[], b: readonly number[], x: number): readonly number[] {
return [...a, x, ...b];
}
export function wrap(xs: readonly number[], lo: number, hi: number): readonly number[] {
return [lo, ...xs, hi];
}
`,
calls: [
{ fn: "pre", args: [{ t: "nums", v: [1, 2] }, f(9)] },
{ fn: "pre", args: [{ t: "nums", v: [] }, f(9)] },
{ fn: "stitch", args: [{ t: "nums", v: [1, 2] }, { t: "nums", v: [3] }, f(9)] },
{ fn: "stitch", args: [{ t: "nums", v: [] }, { t: "nums", v: [] }, f(9)] },
{ fn: "wrap", args: [{ t: "nums", v: [5, 6] }, f(0), f(7)] },
{ fn: "wrap", args: [{ t: "nums", v: [] }, f(0), f(7)] },
],
},
{
name: "bytes slice clamps out-of-range and negative bounds exactly like JS",
src: `
export function window(bytes: Uint8Array, from: number, to: number): Uint8Array {
return bytes.slice(from, to);
}
export function tail(bytes: Uint8Array, from: number): Uint8Array {
return bytes.slice(from);
}
`,
calls: [
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(1), i(99)] },
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(-2), i(99)] },
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(2), i(1)] },
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(-99), i(99)] },
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(5), i(9)] },
{ fn: "tail", args: [{ t: "bytes", v: [1, 2, 3] }, i(5)] },
{ fn: "tail", args: [{ t: "bytes", v: [1, 2, 3] }, i(-1)] },
{ fn: "tail", args: [{ t: "bytes", v: [] }, i(-1)] },
],
},
{
name: "comptime division folds to the JS f64 value, signed zero and NaN included",
src: `
export function nanv(): number { return 0 / 0; }
export function posInf(): number { return 1 / 0; }
export function negInf(): number { return -1 / 0; }
export function negZero(): number { return 0 / -1; }
export function half(): number { return 5 / 2; }
`,
calls: [
{ fn: "nanv", args: [] },
{ fn: "posInf", args: [] },
{ fn: "negInf", args: [] },
{ fn: "negZero", args: [] },
{ fn: "half", args: [] },
],
},
{
name: "block-body callbacks behave like their JS bodies, early returns included",
src: `
export function bigMargins(xs: readonly number[], lim: number): readonly number[] {
return xs.filter((x) => {
if (x < 0) return false;
const margin = x - lim;
return margin > 0.5;
});
}
export function firstSpecial(xs: readonly number[], want: number): number {
const hit = xs.find((x) => {
if (x === want) return true;
return x > want * 2;
});
return hit ?? -1;
}
export function skewedTotal(xs: readonly number[], lim: number): number {
return xs.reduce((sum, x) => {
if (x > lim) return sum + x * 0.5;
return sum + x;
}, 0);
}
`,
calls: [
{ fn: "bigMargins", args: [{ t: "nums", v: [-1, 2, 2.4, 3, 0.5] }, f(1.5)] },
{ fn: "bigMargins", args: [{ t: "nums", v: [] }, f(1.5)] },
{ fn: "firstSpecial", args: [{ t: "nums", v: [1, 9, 4] }, f(4)] },
{ fn: "firstSpecial", args: [{ t: "nums", v: [1, 2] }, f(4)] },
{ fn: "skewedTotal", args: [{ t: "nums", v: [0.1, 0.2, 10] }, f(1)] },
{ fn: "skewedTotal", args: [{ t: "nums", v: [] }, f(1)] },
],
},
{
name: "Math floor/ceil/trunc corners: signed zeros, halves, NaN, infinities, big values",
src: `
export function flo(x: number): number { return Math.floor(x); }
export function cei(x: number): number { return Math.ceil(x); }
export function tru(x: number): number { return Math.trunc(x); }
export function floInt(bytes: Uint8Array): number { return Math.floor(bytes.length); }
export function truInt(bytes: Uint8Array): number { return Math.trunc(bytes.length - 7); }
`,
calls: [
{ fn: "flo", args: [f("-0")] },
{ fn: "flo", args: [f(0.5)] },
{ fn: "flo", args: [f(-0.5)] },
{ fn: "flo", args: [f("nan")] },
{ fn: "flo", args: [f("inf")] },
{ fn: "flo", args: [f("-inf")] },
{ fn: "flo", args: [f(4503599627370495.5)] },
{ fn: "cei", args: [f("-0")] },
{ fn: "cei", args: [f(-0.5)] },
{ fn: "cei", args: [f(0.5)] },
{ fn: "cei", args: [f("nan")] },
{ fn: "cei", args: [f(-4503599627370495.5)] },
{ fn: "tru", args: [f(-0.5)] },
{ fn: "tru", args: [f("-0")] },
{ fn: "tru", args: [f(2.9)] },
{ fn: "tru", args: [f(-2.9)] },
{ fn: "tru", args: [f("nan")] },
{ fn: "tru", args: [f("inf")] },
{ fn: "floInt", args: [{ t: "bytes", v: [1, 2, 3] }] },
{ fn: "truInt", args: [{ t: "bytes", v: [1, 2, 3] }] },
],
},
{
name: "Math abs/sign/sqrt corners: -0 keeps or clears its sign exactly like JS",
src: `
export function ab(x: number): number { return Math.abs(x); }
export function sg(x: number): number { return Math.sign(x); }
export function sq(x: number): number { return Math.sqrt(x); }
export function abInt(bytes: Uint8Array): number { return Math.abs(bytes.length - 10); }
export function sgInt(bytes: Uint8Array): number { return Math.sign(bytes.length - 2); }
`,
calls: [
{ fn: "ab", args: [f("-0")] },
{ fn: "ab", args: [f(-5.5)] },
{ fn: "ab", args: [f("nan")] },
{ fn: "ab", args: [f("-inf")] },
{ fn: "sg", args: [f("-0")] },
{ fn: "sg", args: [f(0)] },
{ fn: "sg", args: [f("nan")] },
{ fn: "sg", args: [f(-3.5)] },
{ fn: "sg", args: [f("inf")] },
{ fn: "sg", args: [f("-inf")] },
{ fn: "sq", args: [f("-0")] },
{ fn: "sq", args: [f(-1)] },
{ fn: "sq", args: [f(2)] },
{ fn: "sq", args: [f("nan")] },
{ fn: "sq", args: [f("inf")] },
{ fn: "sq", args: [f(0)] },
{ fn: "abInt", args: [{ t: "bytes", v: [1, 2, 3] }] },
{ fn: "sgInt", args: [{ t: "bytes", v: [1] }] },
{ fn: "sgInt", args: [{ t: "bytes", v: [1, 2] }] },
{ fn: "sgInt", args: [{ t: "bytes", v: [1, 2, 3] }] },
],
},
{
name: "Math min/max arities and comptime Math/% folds match node exactly",
src: `
export const HALF = Math.floor(5 / 2);
export const ROOT = Math.sqrt(2);
export function noArgMin(): number { return Math.min(); }
export function noArgMax(): number { return Math.max(); }
export function oneArg(x: number): number { return Math.max(x); }
export function three(a: number, b: number, c: number): number { return Math.min(a, b, c); }
export function halfConst(): number { return HALF; }
export function rootConst(): number { return ROOT; }
export function floorDown(): number { return Math.floor(-5 / 2); }
export function ceilNegHalf(): number { return Math.ceil(-0.5); }
export function signNegZero(): number { return Math.sign(-0); }
export function remNan(): number { return 5 % 0; }
export function remNegZero(): number { return -5 % 5; }
export function remFrac(): number { return 5.5 % 2; }
`,
calls: [
{ fn: "noArgMin", args: [] },
{ fn: "noArgMax", args: [] },
{ fn: "oneArg", args: [f("nan")] },
{ fn: "oneArg", args: [f("-0")] },
{ fn: "three", args: [f(2), f("nan"), f(1)] },
{ fn: "three", args: [f(2), f(0.5), f(1)] },
{ fn: "three", args: [f(0), f("-0"), f(0)] },
{ fn: "halfConst", args: [] },
{ fn: "rootConst", args: [] },
{ fn: "floorDown", args: [] },
{ fn: "ceilNegHalf", args: [] },
{ fn: "signNegZero", args: [] },
{ fn: "remNan", args: [] },
{ fn: "remNegZero", args: [] },
{ fn: "remFrac", args: [] },
],
},
{
name: "Number classifiers agree with node over every float class",
src: `
export function isInt(x: number): boolean { return Number.isInteger(x); }
export function isFin(x: number): boolean { return Number.isFinite(x); }
export function isNan(x: number): boolean { return Number.isNaN(x); }
export function intAlways(bytes: Uint8Array): boolean { return Number.isInteger(bytes.length); }
export function intNever(bytes: Uint8Array): boolean { return Number.isNaN(bytes.length); }
export function nanLit(): number { return NaN; }
export function negInfLit(): number { return -Infinity; }
export function isMax(x: number): boolean { return x === Infinity; }
`,
calls: [
{ fn: "isInt", args: [f("-0")] },
{ fn: "isInt", args: [f(5)] },
{ fn: "isInt", args: [f(5.5)] },
{ fn: "isInt", args: [f("nan")] },
{ fn: "isInt", args: [f("inf")] },
{ fn: "isInt", args: [f(9007199254740992)] },
{ fn: "isFin", args: [f("nan")] },
{ fn: "isFin", args: [f("inf")] },
{ fn: "isFin", args: [f("-0")] },
{ fn: "isNan", args: [f("nan")] },
{ fn: "isNan", args: [f(1)] },
{ fn: "isNan", args: [f("inf")] },
{ fn: "intAlways", args: [{ t: "bytes", v: [7] }] },
{ fn: "intNever", args: [{ t: "bytes", v: [7] }] },
{ fn: "nanLit", args: [] },
{ fn: "negInfLit", args: [] },
{ fn: "isMax", args: [f("inf")] },
{ fn: "isMax", args: [f(1)] },
],
},
{
name: "subarray resolves negative, crossed, and out-of-range bounds like JS (views, chained)",
src: `
export function window(bytes: Uint8Array, from: number, to: number): Uint8Array {
return bytes.subarray(from, to);
}
export function tail(bytes: Uint8Array, from: number): Uint8Array {
return bytes.subarray(from);
}
export function whole(bytes: Uint8Array): Uint8Array {
return bytes.subarray();
}
export function chained(bytes: Uint8Array, from: number): Uint8Array {
return bytes.subarray(from).subarray(-2);
}
`,
calls: [
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(1), i(99)] },
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(-2), i(99)] },
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(2), i(1)] },
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(-99), i(99)] },
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(5), i(9)] },
{ fn: "window", args: [{ t: "bytes", v: [1, 2, 3] }, i(1), i(-1)] },
{ fn: "tail", args: [{ t: "bytes", v: [1, 2, 3] }, i(5)] },
{ fn: "tail", args: [{ t: "bytes", v: [1, 2, 3] }, i(-1)] },
{ fn: "tail", args: [{ t: "bytes", v: [] }, i(-1)] },
{ fn: "whole", args: [{ t: "bytes", v: [9, 8] }] },
{ fn: "chained", args: [{ t: "bytes", v: [1, 2, 3, 4] }, i(1)] },
{ fn: "chained", args: [{ t: "bytes", v: [1] }, i(0)] },
],
},
{
name: "module const tables read identically: arrays, records, enums, derived scans",
src: `
import { asciiBytes } from "@native-sdk/core";
export type Filter = "all" | "active" | "done";
export const WEEKDAYS = [3, 5, 2, 8];
export const FACTORS: readonly number[] = [0.5, 1, 2];
export const ORDER: readonly Filter[] = ["done", "active", "all"];
export const DEFAULT_FILTER: Filter = "active";
export interface Limits { readonly lo: number; readonly hi: number; }
export const LIMITS: Limits = { lo: 1, hi: 9 };
export const BAND: Limits = { lo: 0.75, hi: 9.5 };
export interface Task { readonly id: number; readonly title: Uint8Array; readonly done: boolean; }
export const SEEDS: readonly Task[] = [
{ id: 1, title: asciiBytes("Ship"), done: false },
{ id: 2, title: asciiBytes("Test"), done: true },
];
export function weekdayAt(i: number): number { return WEEKDAYS[i]; }
export function weekdayCount(): number { return WEEKDAYS.length; }
export function weekdayTotal(): number {
let t = 0;
for (const w of WEEKDAYS) t += w;
return t;
}
export function bigWeekdays(lim: number): readonly number[] { return WEEKDAYS.filter((w) => w > lim); }
export function factorAt(i: number): number { return FACTORS[i]; }
export function orderAt(i: number): Filter { return ORDER[i]; }
export function fallbackFilter(): Filter { return DEFAULT_FILTER; }
export function inRange(n: Uint8Array): boolean { return n.length >= LIMITS.lo && n.length <= LIMITS.hi; }
export function inBand(x: number): boolean { return x >= BAND.lo && x <= BAND.hi; }
export function seedTitle(i: number): Uint8Array { return SEEDS[i].title; }
export function doneSeedIds(): readonly number[] {
return SEEDS.filter((s) => s.done).map((s) => s.id);
}
`,
calls: [
{ fn: "weekdayAt", args: [i(0)] },
{ fn: "weekdayAt", args: [i(3)] },
{ fn: "weekdayCount", args: [] },
{ fn: "weekdayTotal", args: [] },
{ fn: "bigWeekdays", args: [f(3)] },
{ fn: "bigWeekdays", args: [f(99)] },
{ fn: "factorAt", args: [i(0)] },
{ fn: "orderAt", args: [i(0)] },
{ fn: "orderAt", args: [i(2)] },
{ fn: "fallbackFilter", args: [] },
{ fn: "inRange", args: [{ t: "bytes", v: [1, 2, 3] }] },
{ fn: "inRange", args: [{ t: "bytes", v: [] }] },
{ fn: "inBand", args: [f(5)] },
{ fn: "inBand", args: [f(0.5)] },
{ fn: "inBand", args: [f(0.75)] },
{ fn: "seedTitle", args: [i(0)] },
{ fn: "seedTitle", args: [i(1)] },
{ fn: "doneSeedIds", args: [] },
],
},
{
name: "type-changing map: scalars out of records, bytes out, optional results, block bodies",
src: `
export interface Task { readonly id: number; readonly title: Uint8Array; readonly streak: number; }
export interface Model { readonly tasks: readonly Task[]; }
export type Msg = { readonly kind: "seed"; readonly streak: number } | { readonly kind: "noop" };
export function initialModel(): Model { return { tasks: [] }; }
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "seed": {
const id = model.tasks.length + 1;
const task: Task = { id: id, title: new Uint8Array(0), streak: msg.streak };
return { tasks: [...model.tasks, task] };
}
case "noop": return model;
}
}
export function ids(model: Model): readonly number[] { return model.tasks.map((t) => t.id); }
export function doubled(model: Model): readonly number[] { return model.tasks.map((t) => t.streak * 2); }
export function capped(model: Model, lim: number): readonly number[] {
return model.tasks.map((t) => {
if (t.streak > lim) return lim;
return t.streak;
});
}
export function mappedCount(model: Model): number { return model.tasks.map((t) => t.id).length; }
export function orNull(xs: readonly number[]): readonly (number | null)[] {
return xs.map((x) => (x > 0 ? x : null));
}
`,
node: `
{
let model = mod.initialModel();
for (const s of [2, 0.5, 7]) model = mod.update(model, { kind: "seed", streak: s });
line("m0", mod.ids(model));
line("m1", mod.doubled(model));
line("m2", mod.capped(model, 2));
line("m3", mod.mappedCount(model));
line("m4", mod.orNull([1, -1, 0, 2.5]));
line("m5", mod.orNull([]));
}
`,
zig: `
{
var model = m.initialModel();
for ([_]f64{ 2, 0.5, 7 }) |s| model = m.update(model, .{ .seed = s });
row("m0", m.ids(model));
row("m1", m.doubled(model));
row("m2", m.capped(model, 2));
row("m3", m.mappedCount(model));
row("m4", m.orNull(&[_]f64{ 1, -1, 0, 2.5 }));
row("m5", m.orNull(&[_]f64{}));
}
`,
},
{
name: "callback index parameters count exactly like JS across map/filter/scans",
src: `
export function weighted(xs: readonly number[]): readonly number[] { return xs.map((x, i) => x * i); }
export function evenSlots(xs: readonly number[]): readonly number[] { return xs.filter((x, i) => i % 2 === 0); }
export function lateBig(xs: readonly number[], at: number): number {
return xs.find((x, i) => i > at && x > 0) ?? -1;
}
export function lateAt(xs: readonly number[], at: number): number {
return xs.findIndex((x, i) => i >= at && x > 0);
}
export function anyLate(xs: readonly number[], at: number): boolean {
return xs.some((x, i) => i > at);
}
export function frontLoaded(xs: readonly number[]): boolean {
return xs.every((x, i) => x >= i);
}
`,
calls: [
{ fn: "weighted", args: [{ t: "nums", v: [5, 6, 7] }] },
{ fn: "weighted", args: [{ t: "nums", v: ["-0", 2] }] },
{ fn: "weighted", args: [{ t: "nums", v: [] }] },
{ fn: "evenSlots", args: [{ t: "nums", v: [5, 6, 7, 8] }] },
{ fn: "evenSlots", args: [{ t: "nums", v: [] }] },
{ fn: "lateBig", args: [{ t: "nums", v: [9, -1, 4] }, i(0)] },
{ fn: "lateBig", args: [{ t: "nums", v: [9, -1] }, i(0)] },
{ fn: "lateAt", args: [{ t: "nums", v: [9, -1, 4] }, i(1)] },
{ fn: "lateAt", args: [{ t: "nums", v: [9] }, i(1)] },
{ fn: "anyLate", args: [{ t: "nums", v: [1, 2] }, i(0)] },
{ fn: "anyLate", args: [{ t: "nums", v: [1] }, i(5)] },
{ fn: "frontLoaded", args: [{ t: "nums", v: [0, 1, 2] }] },
{ fn: "frontLoaded", args: [{ t: "nums", v: [0, 0.5] }] },
{ fn: "frontLoaded", args: [{ t: "nums", v: [] }] },
],
},
{
name: "array-method calls in if/else-if and ternary conditions behave identically",
src: `
export function grade(xs: readonly number[], flag: boolean): number {
if (flag) return -1;
else if (xs.some((x) => x > 3)) return 1;
else if (xs.every((x) => x < 0)) return 2;
return 0;
}
export function countIf(xs: readonly number[], lim: number): number {
if (xs.filter((x) => x > lim).length > 1) return 2;
return xs.findIndex((x) => x > lim) >= 0 ? 1 : 0;
}
`,
calls: [
{ fn: "grade", args: [{ t: "nums", v: [1, 5] }, { t: "b", v: true }] },
{ fn: "grade", args: [{ t: "nums", v: [1, 5] }, { t: "b", v: false }] },
{ fn: "grade", args: [{ t: "nums", v: [-1, -2] }, { t: "b", v: false }] },
{ fn: "grade", args: [{ t: "nums", v: [1, 2] }, { t: "b", v: false }] },
{ fn: "grade", args: [{ t: "nums", v: [] }, { t: "b", v: false }] },
{ fn: "countIf", args: [{ t: "nums", v: [5, 6, 1] }, f(4)] },
{ fn: "countIf", args: [{ t: "nums", v: [5, 1] }, f(4)] },
{ fn: "countIf", args: [{ t: "nums", v: [1] }, f(4)] },
],
},
{
name: "switch on a literal-union value matches JS clause selection exactly",
src: `
export type Filter = "all" | "active" | "done";
export type Bit = 0 | 1;
export function label(f: Filter): number {
switch (f) {
case "all": return 0;
case "active": return 1;
case "done": return 2;
}
}
export function sharedBody(f: Filter): number {
switch (f) {
case "active":
case "done":
return 1;
default:
return 0;
}
}
export function partial(f: Filter): number {
let n = 0;
switch (f) {
case "done":
n = 5;
break;
case "active": {
n = 2;
break;
}
}
return n;
}
export function flip(b: Bit): number {
switch (b) {
case 0: return 1;
case 1: return 0;
}
}
`,
calls: [
{ fn: "label", args: [{ t: "tag", v: "all" }] },
{ fn: "label", args: [{ t: "tag", v: "active" }] },
{ fn: "label", args: [{ t: "tag", v: "done" }] },
{ fn: "sharedBody", args: [{ t: "tag", v: "active" }] },
{ fn: "sharedBody", args: [{ t: "tag", v: "done" }] },
{ fn: "sharedBody", args: [{ t: "tag", v: "all" }] },
{ fn: "partial", args: [{ t: "tag", v: "done" }] },
{ fn: "partial", args: [{ t: "tag", v: "active" }] },
{ fn: "partial", args: [{ t: "tag", v: "all" }] },
{ fn: "flip", args: [i(0)] },
{ fn: "flip", args: [i(1)] },
],
},
{
name: "model union arm churn: alternating arms with deep payloads across committed dispatches",
// A tiny heap makes the two-space flip fire DURING arm churn: every arm
// switch kills the old payload, and compaction must copy only through
// the live arm — a stale-pointer chase would trap or diverge here.
options: { frameCap: 32768, heapCap: 4096 },
src: `
import { asciiBytes } from "@native-sdk/core";
export interface Note { readonly id: number; readonly title: Uint8Array; }
export type View =
| { readonly kind: "list"; readonly scroll: number }
| { readonly kind: "detail"; readonly note: Note; readonly tags: readonly number[] }
| { readonly kind: "compose"; readonly draft: Uint8Array };
export interface Model { readonly view: View; readonly visits: number; }
export type Msg =
| { readonly kind: "open"; readonly id: number }
| { readonly kind: "compose_new" }
| { readonly kind: "back" };
export function initialModel(): Model {
return { view: { kind: "list", scroll: 0 }, visits: 0 };
}
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "open":
return {
view: { kind: "detail", note: { id: msg.id, title: asciiBytes(\`note \${msg.id & 255}\`) }, tags: [msg.id, msg.id * 2] },
visits: model.visits + 1,
};
case "compose_new":
return { view: { kind: "compose", draft: asciiBytes("draft") }, visits: model.visits + 1 };
case "back":
return { view: { kind: "list", scroll: model.visits }, visits: model.visits + 1 };
}
}
export function summary(model: Model): number {
switch (model.view.kind) {
case "list": return model.view.scroll;
case "detail": return model.view.note.id + model.view.tags.length;
case "compose": return model.view.draft.length;
}
}
export function title(model: Model): Uint8Array {
if (model.view.kind === "detail") return model.view.note.title;
return new Uint8Array(0);
}
export function tagSum(model: Model): number {
if (model.view.kind === "detail") return model.view.tags.reduce((s, t) => s + t, 0);
return -1;
}
`,
node: `
{
let model = mod.initialModel();
line("a0", mod.summary(model));
const script = [
{ kind: "open", id: 7 }, { kind: "compose_new" }, { kind: "back" },
{ kind: "open", id: 40 }, { kind: "open", id: 3 }, { kind: "back" },
{ kind: "compose_new" }, { kind: "open", id: 12 },
];
for (const msg of script) {
model = mod.update(model, msg);
line("st", mod.summary(model));
line("ti", mod.title(model));
line("tg", mod.tagSum(model));
}
line("a1", model.visits);
for (let r = 0; r < 90; r++) {
const msg = r % 3 === 0 ? { kind: "open", id: r } : r % 3 === 1 ? { kind: "compose_new" } : { kind: "back" };
model = mod.update(model, msg);
if (r % 15 === 0) {
line("cs", mod.summary(model));
line("ct", mod.title(model));
}
}
line("cmp", true);
line("a2", mod.summary(model));
}
`,
zig: `
{
m.rt.resetAll();
var model = m.commitModelRoot(m.initialModel());
m.rt.frameReset();
row("a0", m.summary(model));
const script = [_]m.Msg{
.{ .open = 7 }, .compose_new, .back,
.{ .open = 40 }, .{ .open = 3 }, .back,
.compose_new, .{ .open = 12 },
};
for (script) |msg| {
model = m.commitModelRoot(m.update(model, msg));
m.rt.frameReset();
row("st", m.summary(model));
row("ti", m.title(model));
row("tg", m.tagSum(model));
}
row("a1", model.visits);
var r: i64 = 0;
while (r < 90) : (r += 1) {
const msg: m.Msg = if (@rem(r, 3) == 0) .{ .open = r } else if (@rem(r, 3) == 1) .compose_new else .back;
model = m.commitModelRoot(m.update(model, msg));
m.rt.frameReset();
if (@rem(r, 15) == 0) {
row("cs", m.summary(model));
row("ct", m.title(model));
}
}
row("cmp", m.rt.stat_compactions > 0);
row("a2", m.summary(model));
}
`,
},
{
name: "primitive arrays in the model: grow/shrink/replace churn and structural sharing",
src: `
export interface Model { readonly xs: readonly number[]; readonly flags: readonly boolean[]; readonly ticks: number; }
export type Msg =
| { readonly kind: "push"; readonly v: number }
| { readonly kind: "double" }
| { readonly kind: "drop_first" }
| { readonly kind: "mark"; readonly on: boolean }
| { readonly kind: "replace" }
| { readonly kind: "noop" };
export function initialModel(): Model { return { xs: [], flags: [], ticks: 0 }; }
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "push": return { ...model, xs: [...model.xs, msg.v], ticks: model.ticks + 1 };
case "double": return { ...model, xs: model.xs.map((x) => x * 2), ticks: model.ticks + 1 };
case "drop_first": return { ...model, xs: model.xs.slice(1), ticks: model.ticks + 1 };
case "mark": return { ...model, flags: [...model.flags, msg.on], ticks: model.ticks + 1 };
case "replace": return { ...model, xs: [0.5, -0.5, 3], ticks: model.ticks + 1 };
case "noop": return { ...model, ticks: model.ticks + 1 };
}
}
export function xsNow(model: Model): readonly number[] { return model.xs; }
export function trueCount(model: Model): number { return model.flags.filter((f) => f).length; }
`,
node: `
{
let model = mod.initialModel();
const script = [
{ kind: "push", v: 1.5 }, { kind: "push", v: 2 }, { kind: "push", v: 3 },
{ kind: "double" }, { kind: "mark", on: true }, { kind: "drop_first" },
{ kind: "push", v: 4 }, { kind: "replace" }, { kind: "mark", on: false }, { kind: "double" },
];
for (const msg of script) {
model = mod.update(model, msg);
line("xs", mod.xsNow(model));
line("tc", mod.trueCount(model));
}
model = mod.update(model, { kind: "noop" });
line("shr", true);
line("xs2", mod.xsNow(model));
}
`,
zig: `
{
m.rt.resetAll();
var model = m.commitModelRoot(m.initialModel());
m.rt.frameReset();
const script = [_]m.Msg{
.{ .push = 1.5 }, .{ .push = 2 }, .{ .push = 3 },
.double, .{ .mark = true }, .drop_first,
.{ .push = 4 }, .replace, .{ .mark = false }, .double,
};
for (script) |msg| {
model = m.commitModelRoot(m.update(model, msg));
m.rt.frameReset();
row("xs", m.xsNow(model));
row("tc", m.trueCount(model));
}
// Structural sharing: a dispatch that reuses every array commits
// only the model struct itself (pointer-shared slices copy nothing).
model = m.commitModelRoot(m.update(model, .noop));
m.rt.frameReset();
row("shr", m.rt.stat_commit_last <= @sizeOf(m.Model) + 16);
row("xs2", m.xsNow(model));
}
`,
},
{
name: "optional model fields: set/clear cycles over records, bytes, and numbers",
src: `
import { asciiBytes } from "@native-sdk/core";
export interface Sel { readonly at: number; readonly len: number; }
export interface Model { readonly sel: Sel | null; readonly note: Uint8Array | null; readonly last: number | null; }
export type Msg =
| { readonly kind: "pick"; readonly at: number; readonly len: number }
| { readonly kind: "annotate" }
| { readonly kind: "clear" };
export function initialModel(): Model { return { sel: null, note: null, last: null }; }
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "pick": return { sel: { at: msg.at, len: msg.len }, note: model.note, last: msg.at };
case "annotate":
return { ...model, note: model.sel !== null && model.sel.len > 0 ? asciiBytes("picked") : null };
case "clear": return { sel: null, note: null, last: model.last };
}
}
export function selWidth(model: Model): number {
return model.sel !== null && model.sel.len > 2 ? model.sel.len : 0;
}
export function noteLen(model: Model): number {
return model.note === null || model.note.length === 0 ? -1 : model.note.length;
}
export function hasSel(model: Model): boolean {
return model.sel !== null && model.sel.at >= 0;
}
export function lastOr(model: Model): number {
return model.last ?? -7;
}
`,
node: `
{
let model = mod.initialModel();
const script = [
{ kind: "annotate" }, { kind: "pick", at: 4, len: 3 }, { kind: "annotate" },
{ kind: "clear" }, { kind: "pick", at: 1, len: 9 }, { kind: "annotate" },
{ kind: "pick", at: -2, len: 0 }, { kind: "annotate" }, { kind: "clear" },
];
for (const msg of script) {
model = mod.update(model, msg);
line("w", mod.selWidth(model));
line("n", mod.noteLen(model));
line("h", mod.hasSel(model));
line("l", mod.lastOr(model));
}
}
`,
zig: `
{
m.rt.resetAll();
var model = m.commitModelRoot(m.initialModel());
m.rt.frameReset();
const script = [_]m.Msg{
.annotate, .{ .pick = .{ .at = 4, .len = 3 } }, .annotate,
.clear, .{ .pick = .{ .at = 1, .len = 9 } }, .annotate,
.{ .pick = .{ .at = -2, .len = 0 } }, .annotate, .clear,
};
for (script) |msg| {
model = m.commitModelRoot(m.update(model, msg));
m.rt.frameReset();
row("w", m.selWidth(model));
row("n", m.noteLen(model));
row("h", m.hasSel(model));
row("l", m.lastOr(model));
}
}
`,
},
{
name: "null-guarded chains: && / || narrowing over optionals, both orders, loops",
src: `
export interface Box { readonly items: readonly number[]; readonly tag: number; }
export function hasBig(box: Box | null, lim: number): boolean {
return box !== null && box.items.length > 0 && box.tag > lim;
}
export function emptyish(box: Box | null): boolean {
return box === null || box.items.length === 0;
}
export function pickTag(box: Box | null): number {
return box !== null && box.tag > 0 ? box.tag : -1;
}
export function guardRight(box: Box | null): number {
if (null !== box && box.tag >= 0) return box.tag + 100;
return -100;
}
export function below(cls: number | null, lim: number): boolean {
return cls !== null && cls < lim;
}
export function clamp(cls: number | null): number {
if (cls === null || cls < 0) return 0;
return cls;
}
export function walkDown(seed: number): number {
let cur: Box | null = { items: [seed], tag: seed };
let hops = 0;
while (cur !== null && cur.tag > 0) {
hops += 1;
cur = cur.tag > 1 ? { items: cur.items, tag: cur.tag - 1 } : null;
}
return hops;
}
`,
node: `
{
line("d0", mod.hasBig(null, 1));
line("d1", mod.hasBig({ items: [1, 2], tag: 5 }, 1));
line("d2", mod.hasBig({ items: [], tag: 5 }, 1));
line("d3", mod.hasBig({ items: [1], tag: 0 }, 1));
line("d4", mod.emptyish(null));
line("d5", mod.emptyish({ items: [], tag: 1 }));
line("d6", mod.emptyish({ items: [2], tag: 1 }));
line("d7", mod.pickTag(null));
line("d8", mod.pickTag({ items: [], tag: 9 }));
line("d9", mod.pickTag({ items: [], tag: -9 }));
line("d10", mod.guardRight(null));
line("d11", mod.guardRight({ items: [], tag: 4 }));
line("d12", mod.below(null, 5));
line("d13", mod.below(3, 5));
line("d14", mod.below(7, 5));
line("d15", mod.clamp(null));
line("d16", mod.clamp(-3));
line("d17", mod.clamp(6));
line("d18", mod.walkDown(4));
line("d19", mod.walkDown(0));
}
`,
zig: `
{
row("d0", m.hasBig(null, 1));
row("d1", m.hasBig(.{ .items = &.{ 1, 2 }, .tag = 5 }, 1));
row("d2", m.hasBig(.{ .items = &.{}, .tag = 5 }, 1));
row("d3", m.hasBig(.{ .items = &.{1}, .tag = 0 }, 1));
row("d4", m.emptyish(null));
row("d5", m.emptyish(.{ .items = &.{}, .tag = 1 }));
row("d6", m.emptyish(.{ .items = &.{2}, .tag = 1 }));
row("d7", m.pickTag(null));
row("d8", m.pickTag(.{ .items = &.{}, .tag = 9 }));
row("d9", m.pickTag(.{ .items = &.{}, .tag = -9 }));
row("d10", m.guardRight(null));
row("d11", m.guardRight(.{ .items = &.{}, .tag = 4 }));
row("d12", m.below(null, 5));
row("d13", m.below(3, 5));
row("d14", m.below(7, 5));
row("d15", m.clamp(null));
row("d16", m.clamp(-3));
row("d17", m.clamp(6));
row("d18", m.walkDown(4));
row("d19", m.walkDown(0));
}
`,
},
{
name: "-0 literals and -0-producing arithmetic keep the signed zero end to end",
src: `
export function negZero(): number { return -0; }
export function prodNegZero(): number { return 0 * -1; }
export function viaConst(): number { const z = -0; return z; }
export function timesNeg(x: number): number { return x * -1; }
export function plusZero(x: number): number { return -0 + x; }
`,
calls: [
{ fn: "negZero", args: [] },
{ fn: "prodNegZero", args: [] },
{ fn: "viaConst", args: [] },
{ fn: "timesNeg", args: [f(0)] },
{ fn: "timesNeg", args: [f("-0")] },
{ fn: "timesNeg", args: [f(2.5)] },
{ fn: "plusZero", args: [f(0)] },
{ fn: "plusZero", args: [f("-0")] },
],
},
{
name: "nested callbacks with shared element/index names fold identically",
src: `
export function weights(xs: readonly number[]): number {
return xs.map((x, i) => xs.map((y, i2) => y * i2 + i).reduce((acc, v) => acc + v, 0) + x * i).reduce((acc, v) => acc + v, 0);
}
export function pairs(xs: readonly number[]): number {
return xs.map((x, i) => xs.map((x2, j) => x2 * x + j * i).reduce((a, v) => a + v, 0)).reduce((a, v) => a + v, 0);
}
`,
calls: [
{ fn: "weights", args: [{ t: "nums", v: [1.5, 2, -3] }] },
{ fn: "weights", args: [{ t: "nums", v: [] }] },
{ fn: "pairs", args: [{ t: "nums", v: [2, 3] }] },
{ fn: "pairs", args: [{ t: "nums", v: [0.5] }] },
],
},
{
name: "host-boundary params stay f64: fractional host values compare exactly",
// Regression (round 2C): comparison against an i64-classed value (a
// length read, a byte read) must NOT claim an exported parameter to
// i64 — the host may pass a fraction there, and node compares it
// exactly. The 2.5/7.5 calls fail to even compile if the claim comes
// back (the native driver would pass a fraction to an i64 parameter).
src: `
export function lenIs(bytes: Uint8Array, want: number): boolean {
return bytes.length === want;
}
export function badge(bytes: Uint8Array, want: number): number {
return bytes.length === want ? 1 : 0;
}
export function firstIs(bytes: Uint8Array, want: number): boolean {
return bytes[0] === want;
}
export function pastEnd(bytes: Uint8Array, cursor: number): boolean {
return cursor >= bytes.length;
}
`,
calls: [
{ fn: "lenIs", args: [{ t: "bytes", v: [1, 2, 3] }, f(3)] },
{ fn: "lenIs", args: [{ t: "bytes", v: [1, 2, 3] }, f(2.5)] },
{ fn: "lenIs", args: [{ t: "bytes", v: [] }, f(0)] },
{ fn: "lenIs", args: [{ t: "bytes", v: [] }, f("-0")] },
{ fn: "lenIs", args: [{ t: "bytes", v: [1] }, f("nan")] },
{ fn: "badge", args: [{ t: "bytes", v: [1, 2] }, f(2)] },
{ fn: "badge", args: [{ t: "bytes", v: [1, 2] }, f(1.5)] },
{ fn: "firstIs", args: [{ t: "bytes", v: [7, 8] }, f(7)] },
{ fn: "firstIs", args: [{ t: "bytes", v: [7, 8] }, f(7.5)] },
{ fn: "pastEnd", args: [{ t: "bytes", v: [1, 2] }, f(1.5)] },
{ fn: "pastEnd", args: [{ t: "bytes", v: [1, 2] }, f(2)] },
{ fn: "pastEnd", args: [{ t: "bytes", v: [] }, f("-0")] },
],
},
{
name: "Cmd v2 host payloads: bytes (empty, large, non-ASCII) and derived records",
src: `
import { Cmd, asciiBytes } from "@native-sdk/core";
export interface Model { readonly count: number; }
export type Msg =
| { readonly kind: "put"; readonly blob: Uint8Array }
| { readonly kind: "empty" }
| { readonly kind: "cfg"; readonly gain: number; readonly on: boolean };
export function initialModel(): Model { return { count: 0 }; }
export function update(model: Model, msg: Msg): Model | [Model, Cmd<Msg>] {
switch (msg.kind) {
case "put": return [{ count: model.count + 1 }, Cmd.host("blob.write", msg.blob)];
case "empty": return [model, Cmd.host("blob.write", new Uint8Array(0))];
case "cfg": return [model, Cmd.host("cfg.save", { gain: msg.gain, on: msg.on, tag: asciiBytes("v2") })];
}
}
`,
node: `
{
// Mirror of the rt kernel's Cmd wire format v2 host_bytes record:
// [0x04][name_len u8][name][payload_len u32 LE][payload].
const enc = (cmd) => {
if (cmd.op === "none") return [];
if (cmd.op === "host_bytes") {
const name = Array.from(new TextEncoder().encode(cmd.name));
const len = cmd.payload.length;
return [4, name.length, ...name, len & 255, (len >> 8) & 255, (len >> 16) & 255, (len >>> 24) & 255, ...cmd.payload];
}
return cmd.cmds.flatMap(enc);
};
const step = (model, msg) => {
const r = mod.update(model, msg);
return Array.isArray(r) ? [r[0], Uint8Array.from(enc(r[1]))] : [r, new Uint8Array(0)];
};
let model = mod.initialModel();
let cmd;
const big = Uint8Array.from({ length: 300 }, (_, i) => (i * 7) % 251);
[model, cmd] = step(model, { kind: "put", blob: big });
line("h0", cmd);
[model, cmd] = step(model, { kind: "put", blob: Uint8Array.from([0, 255, 128, 10]) });
line("h1", cmd);
[model, cmd] = step(model, { kind: "empty" });
line("h2", cmd);
[model, cmd] = step(model, { kind: "cfg", gain: 2.5, on: true });
line("h3", cmd);
[model, cmd] = step(model, { kind: "cfg", gain: -0, on: false });
line("h4", cmd);
line("h5", model.count);
}
`,
zig: `
{
var model = m.initialModel();
var big: [300]u8 = undefined;
for (&big, 0..) |*b, i| b.* = @intCast((i * 7) % 251);
var r = m.update(model, .{ .put = &big });
model = r.model;
row("h0", r.cmd);
r = m.update(model, .{ .put = &[_]u8{ 0, 255, 128, 10 } });
model = r.model;
row("h1", r.cmd);
r = m.update(model, .empty);
model = r.model;
row("h2", r.cmd);
r = m.update(model, .{ .cfg = .{ .gain = 2.5, .on = true } });
model = r.model;
row("h3", r.cmd);
r = m.update(model, .{ .cfg = .{ .gain = -0.0, .on = false } });
model = r.model;
row("h4", r.cmd);
row("h5", model.count);
}
`,
},
{
name: "Cmd v2 routed requests: init command, ok and err arms delivered as Msgs, cancel",
src: `
import { Cmd, asciiBytes } from "@native-sdk/core";
export interface Model { readonly data: Uint8Array; readonly errs: number; }
export type Msg =
| { readonly kind: "load" }
| { readonly kind: "bad" }
| { readonly kind: "stop" }
| { readonly kind: "loaded"; readonly body: Uint8Array }
| { readonly kind: "failed"; readonly why: Uint8Array };
export function initialModel(): [Model, Cmd<Msg>] {
return [
{ data: new Uint8Array(0), errs: 0 },
Cmd.request("store.read", asciiBytes("boot.bin"), { key: "boot", ok: "loaded", err: "failed" }),
];
}
export function update(model: Model, msg: Msg): Model | [Model, Cmd<Msg>] {
switch (msg.kind) {
case "load": return [model, Cmd.request("store.read", asciiBytes("notes.json"), { key: "load", ok: "loaded", err: "failed" })];
case "bad": return [model, Cmd.request("store.read", asciiBytes("missing.bin"), { ok: "loaded", err: "failed" })];
case "stop": return [model, Cmd.cancel("load")];
case "loaded": return { ...model, data: msg.body };
case "failed": return { ...model, errs: model.errs + 1 };
}
}
export function dataLen(model: Model): number { return model.data.length; }
`,
node: `
{
const kinds = ["load", "bad", "stop", "loaded", "failed"];
// Mirror of the v2 request/cancel records:
// request [0x05][name_len][name][key_len][key][ok][err][len u32 LE][payload]
// cancel [0x06][key_len][key]
const enc = (cmd) => {
if (cmd.op === "none") return [];
if (cmd.op === "cancel") {
const key = Array.from(new TextEncoder().encode(cmd.key));
return [6, key.length, ...key];
}
if (cmd.op === "request") {
const name = Array.from(new TextEncoder().encode(cmd.name));
const key = Array.from(new TextEncoder().encode(cmd.key));
const p = cmd.payload;
return [5, name.length, ...name, key.length, ...key, kinds.indexOf(cmd.okKind), kinds.indexOf(cmd.errKind), p.length & 255, (p.length >> 8) & 255, (p.length >> 16) & 255, (p.length >>> 24) & 255, ...p];
}
return cmd.cmds.flatMap(enc);
};
const step = (model, msg) => {
const r = mod.update(model, msg);
return Array.isArray(r) ? [r[0], Uint8Array.from(enc(r[1]))] : [r, new Uint8Array(0)];
};
// A scripted host: read the routing tags off the wire and answer with an
// ordinary Msg built from the named arm's declared shape.
const routeTags = (bytes) => {
let at = 1;
at += 1 + bytes[at];
at += 1 + bytes[at];
return [bytes[at], bytes[at + 1]];
};
const respond = (model, bytes, okBody, errWhy) => {
const [ok, err] = routeTags(bytes);
const msg = okBody !== null ? { kind: kinds[ok], body: okBody } : { kind: kinds[err], why: errWhy };
return step(model, msg);
};
const bytesOf = (s) => new TextEncoder().encode(s);
const boot = mod.initialModel();
let model = boot[0];
let cmd = Uint8Array.from(enc(boot[1]));
line("r0", cmd);
[model, cmd] = respond(model, cmd, bytesOf("boot bytes"), null);
line("r1", cmd);
line("r2", model.data);
[model, cmd] = step(model, { kind: "load" });
line("r3", cmd);
[model, cmd] = respond(model, cmd, Uint8Array.from([1, 2, 3]), null);
line("r4", model.data);
[model, cmd] = step(model, { kind: "bad" });
line("r5", cmd);
[model, cmd] = respond(model, cmd, null, bytesOf("not found"));
line("r6", model.errs);
line("r7", model.data);
[model, cmd] = step(model, { kind: "stop" });
line("r8", cmd);
line("r9", mod.dataLen(model));
}
`,
zig: `
{
const Host = struct {
// Read [ok_tag, err_tag] off a wire request record.
fn routeTags(bytes: []const u8) [2]u8 {
var at: usize = 1;
at += 1 + bytes[at];
at += 1 + bytes[at];
return .{ bytes[at], bytes[at + 1] };
}
};
const loaded_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).loaded);
const boot = m.initialModel();
var model = boot.model;
row("r0", boot.cmd);
var t = Host.routeTags(boot.cmd);
var r = m.update(model, if (t[0] == loaded_tag) m.Msg{ .loaded = "boot bytes" } else m.Msg{ .failed = "?" });
model = r.model;
row("r1", r.cmd);
row("r2", model.data);
r = m.update(model, .load);
model = r.model;
row("r3", r.cmd);
t = Host.routeTags(r.cmd);
r = m.update(model, if (t[0] == loaded_tag) m.Msg{ .loaded = &[_]u8{ 1, 2, 3 } } else m.Msg{ .failed = "?" });
model = r.model;
row("r4", model.data);
r = m.update(model, .bad);
model = r.model;
row("r5", r.cmd);
t = Host.routeTags(r.cmd);
r = m.update(model, if (t[1] == @intFromEnum(std.meta.Tag(m.Msg).failed)) m.Msg{ .failed = "not found" } else m.Msg{ .loaded = "?" });
model = r.model;
row("r6", model.errs);
row("r7", model.data);
r = m.update(model, .stop);
model = r.model;
row("r8", r.cmd);
row("r9", m.dataLen(model));
}
`,
},
{
name: "subscriptions under virtual time: reconcile-by-key, re-arm on interval change, pause and resume",
src: `
import { Sub } from "@native-sdk/core";
export interface Model { readonly running: boolean; readonly fast: boolean; readonly ticks: number; readonly blinks: number; readonly lastAt: number; }
export type Msg =
| { readonly kind: "toggle" }
| { readonly kind: "speed" }
| { readonly kind: "tick"; readonly at: number }
| { readonly kind: "blink"; readonly at: number };
export function initialModel(): Model {
return { running: true, fast: false, ticks: 0, blinks: 0, lastAt: -1 };
}
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "toggle": return { ...model, running: !model.running };
case "speed": return { ...model, fast: !model.fast };
case "tick": return { ...model, ticks: model.ticks + 1, lastAt: msg.at };
case "blink": return { ...model, blinks: model.blinks + 1, lastAt: msg.at };
}
}
export function subscriptions(model: Model): Sub<Msg> {
if (!model.running) return Sub.none;
return Sub.batch([
Sub.timer("tick", model.fast ? 40 : 100, "tick"),
Sub.timer("blink", 250, "blink"),
]);
}
`,
node: `
{
const kinds = ["toggle", "speed", "tick", "blink"];
// Mirror of the v2 timer record: [0x01][key_len][key][every f64 LE][tag].
const encSub = (s) => {
if (s.op === "none") return [];
if (s.op === "timer") {
const key = Array.from(new TextEncoder().encode(s.key));
const dv = new DataView(new ArrayBuffer(8));
dv.setFloat64(0, s.everyMs, true);
const every = [];
for (let i = 0; i < 8; i++) every.push(dv.getUint8(i));
return [1, key.length, ...key, ...every, kinds.indexOf(s.msgKind)];
}
return s.subs.flatMap(encSub);
};
const parseSubs = (bytes) => {
const out = [];
let at = 0;
while (at < bytes.length) {
at += 1;
const keyLen = bytes[at]; at += 1;
let key = "";
for (let i = 0; i < keyLen; i++) key += String.fromCharCode(bytes[at + i]);
at += keyLen;
const dv = new DataView(Uint8Array.from(bytes.slice(at, at + 8)).buffer);
out.push({ key, every: dv.getFloat64(0, true), tag: bytes[at + 8] });
at += 9;
}
return out;
};
let model = mod.initialModel();
let now = 0;
// Four fixed timer slots, reconciled by key: same algorithm as the zig
// driver, so firing order is identical by construction.
const timers = [null, null, null, null];
const reconcile = () => {
const bytes = encSub(mod.subscriptions(model));
const want = parseSubs(bytes);
const seen = [false, false, false, false];
for (const w of want) {
let slot = -1;
for (let i = 0; i < 4; i++) if (timers[i] !== null && timers[i].key === w.key) slot = i;
if (slot >= 0) {
seen[slot] = true;
if (timers[slot].every !== w.every) {
timers[slot].every = w.every;
timers[slot].next = now + w.every;
}
timers[slot].tag = w.tag;
} else {
for (let i = 0; i < 4; i++) {
if (timers[i] === null) {
timers[i] = { key: w.key, every: w.every, next: now + w.every, tag: w.tag };
seen[i] = true;
break;
}
}
}
}
for (let i = 0; i < 4; i++) if (timers[i] !== null && !seen[i]) timers[i] = null;
return bytes;
};
line("v0", Uint8Array.from(reconcile()));
const inject = { 8: "speed", 14: "toggle", 20: "toggle" };
for (let step = 1; step <= 26; step++) {
now += 25;
for (;;) {
let idx = -1;
for (let i = 0; i < 4; i++) {
if (timers[i] !== null && timers[i].next <= now) { idx = i; break; }
}
if (idx < 0) break;
timers[idx].next += timers[idx].every;
model = mod.update(model, { kind: kinds[timers[idx].tag], at: now });
reconcile();
}
if (inject[step] !== undefined) {
model = mod.update(model, { kind: inject[step] });
line("vr" + step, Uint8Array.from(reconcile()));
}
}
line("v1", model.ticks);
line("v2", model.blinks);
line("v3", model.lastAt);
line("v4", Uint8Array.from(encSub(mod.subscriptions(model))));
}
`,
zig: `
{
const Timer = struct { key: [16]u8, key_len: usize, every: f64, next: f64, tag: u8, live: bool };
const Host = struct {
// Reconcile the four fixed slots against a wire descriptor set:
// match by key, re-arm on interval change, cancel the missing.
fn reconcile(timers: []Timer, now: f64, subs: []const u8) void {
var seen = [_]bool{false} ** 4;
var at: usize = 0;
while (at < subs.len) {
at += 1; // timer op
const key_len: usize = subs[at];
at += 1;
const key = subs[at .. at + key_len];
at += key_len;
const every: f64 = @bitCast(std.mem.readInt(u64, subs[at..][0..8], .little));
at += 8;
const tag = subs[at];
at += 1;
var slot: ?usize = null;
for (timers, 0..) |t, i| {
if (t.live and std.mem.eql(u8, t.key[0..t.key_len], key)) slot = i;
}
if (slot) |i| {
seen[i] = true;
if (timers[i].every != every) {
timers[i].every = every;
timers[i].next = now + every;
}
timers[i].tag = tag;
} else {
for (timers, 0..) |t, i| {
if (!t.live) {
seen[i] = true;
timers[i] = .{ .key = undefined, .key_len = key_len, .every = every, .next = now + every, .tag = tag, .live = true };
@memcpy(timers[i].key[0..key_len], key);
break;
}
}
}
}
for (timers, 0..) |t, i| {
if (t.live and !seen[i]) timers[i].live = false;
}
}
};
var timers = [1]Timer{.{ .key = undefined, .key_len = 0, .every = 0, .next = 0, .tag = 0, .live = false }} ** 4;
var model = m.initialModel();
var now: f64 = 0;
{
const subs = m.subscriptions(model);
Host.reconcile(&timers, now, subs);
row("v0", subs);
}
const tick_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).tick);
var step: i64 = 1;
while (step <= 26) : (step += 1) {
now += 25;
while (true) {
var idx: ?usize = null;
for (timers, 0..) |t, i| {
if (t.live and t.next <= now) {
idx = i;
break;
}
}
const i = idx orelse break;
timers[i].next += timers[i].every;
const msg: m.Msg = if (timers[i].tag == tick_tag) .{ .tick = now } else .{ .blink = now };
model = m.update(model, msg);
Host.reconcile(&timers, now, m.subscriptions(model));
}
if (step == 8 or step == 14 or step == 20) {
model = m.update(model, if (step == 8) m.Msg.speed else m.Msg.toggle);
const subs = m.subscriptions(model);
Host.reconcile(&timers, now, subs);
if (step == 8) row("vr8", subs) else if (step == 14) row("vr14", subs) else row("vr20", subs);
}
}
row("v1", model.ticks);
row("v2", model.blinks);
row("v3", model.lastAt);
row("v4", m.subscriptions(model));
}
`,
},
{
name: "walker determinism under forced compaction: tiny heap, sustained churn",
options: { frameCap: 32768, heapCap: 8192 },
src: `
import { asciiBytes } from "@native-sdk/core";
export interface Entry { readonly id: number; readonly label: Uint8Array; }
export interface Model { readonly entries: readonly Entry[]; readonly total: number; }
export type Msg =
| { readonly kind: "note"; readonly id: number }
| { readonly kind: "trim" };
export function initialModel(): Model { return { entries: [], total: 0 }; }
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "note": {
const label = asciiBytes(\`entry \${msg.id & 1023}\`);
return { entries: [...model.entries, { id: msg.id, label: label }], total: model.total + label.length };
}
case "trim": return { ...model, entries: model.entries.slice(1) };
}
}
export function idSum(model: Model): number {
let t = 0;
for (const e of model.entries) t += e.id;
return t;
}
export function labelBytes(model: Model): number {
let t = 0;
for (const e of model.entries) t += e.label.length;
return t;
}
export function count(model: Model): number { return model.entries.length; }
`,
node: `
{
let model = mod.initialModel();
for (let r = 0; r < 120; r++) {
model = mod.update(model, { kind: "note", id: r });
model = mod.update(model, { kind: "note", id: r + 500 });
model = mod.update(model, { kind: "trim" });
if (r % 20 === 0) {
line("c", mod.count(model));
line("s", mod.idSum(model));
line("b", mod.labelBytes(model));
}
}
line("cmp", true);
line("fin", mod.idSum(model));
line("tot", model.total);
}
`,
zig: `
{
m.rt.resetAll();
var model = m.commitModelRoot(m.initialModel());
m.rt.frameReset();
var r: i64 = 0;
while (r < 120) : (r += 1) {
model = m.commitModelRoot(m.update(model, .{ .note = r }));
m.rt.frameReset();
model = m.commitModelRoot(m.update(model, .{ .note = r + 500 }));
m.rt.frameReset();
model = m.commitModelRoot(m.update(model, .trim));
m.rt.frameReset();
if (@rem(r, 20) == 0) {
row("c", m.count(model));
row("s", m.idSum(model));
row("b", m.labelBytes(model));
}
}
// The tiny heap makes the two-space flip fire for real: silence here
// would mean the case stopped proving compaction determinism.
row("cmp", m.rt.stat_compactions > 0);
row("fin", m.idSum(model));
row("tot", model.total);
}
`,
},
{
name: "named file/clipboard ops: wire records and ok/void/err arms under a virtual host",
src: `
import { Cmd, asciiBytes } from "@native-sdk/core";
export interface Model { readonly data: Uint8Array; readonly saved: number; readonly errs: number; readonly lastErr: Uint8Array; }
export type Msg =
| { readonly kind: "load" }
| { readonly kind: "save" }
| { readonly kind: "copy" }
| { readonly kind: "paste" }
| { readonly kind: "loaded"; readonly body: Uint8Array }
| { readonly kind: "wrote" }
| { readonly kind: "failed"; readonly why: Uint8Array };
export function initialModel(): Model { return { data: new Uint8Array(0), saved: 0, errs: 0, lastErr: new Uint8Array(0) }; }
export function update(model: Model, msg: Msg): Model | [Model, Cmd<Msg>] {
switch (msg.kind) {
case "load": return [model, Cmd.readFile(asciiBytes("store.bin"), { key: "io", ok: "loaded", err: "failed" })];
case "save": return [model, Cmd.writeFile(asciiBytes("store.bin"), model.data, { key: "io", ok: "wrote", err: "failed" })];
case "copy": return [model, Cmd.clipboardWrite(model.data)];
case "paste": return [model, Cmd.clipboardRead({ key: "clip", ok: "loaded", err: "failed" })];
case "loaded": return { ...model, data: msg.body };
case "wrote": return { ...model, saved: model.saved + 1 };
case "failed": return { ...model, errs: model.errs + 1, lastErr: msg.why };
}
}
`,
node: `
{
const kinds = ["load", "save", "copy", "paste", "loaded", "wrote", "failed"];
const te = new TextEncoder();
// Mirrors of the named-op wire records (rt.zig): routed head =
// [op][key_len][key][ok][err]; long fields = [len u32 LE][bytes].
const long = (b) => [b.length & 255, (b.length >> 8) & 255, (b.length >> 16) & 255, (b.length >>> 24) & 255, ...b];
const head = (op, c) => { const k = Array.from(te.encode(c.key)); return [op, k.length, ...k, kinds.indexOf(c.okKind), kinds.indexOf(c.errKind)]; };
const enc = (cmd) => {
if (cmd.op === "none") return [];
if (cmd.op === "read_file") return [...head(7, cmd), ...long(Array.from(cmd.path))];
if (cmd.op === "write_file") return [...head(8, cmd), ...long(Array.from(cmd.path)), ...long(Array.from(cmd.bytes))];
if (cmd.op === "clip_write") return [10, ...long(Array.from(cmd.bytes))];
if (cmd.op === "clip_read") return head(11, cmd);
return cmd.cmds.flatMap(enc);
};
const step = (model, msg) => { const r = mod.update(model, msg); return Array.isArray(r) ? [r[0], Uint8Array.from(enc(r[1]))] : [r, new Uint8Array(0)]; };
// ok/err tags sit right after the key on every routed head.
const routeTags = (bytes) => { let at = 1; at += 1 + bytes[at]; return [bytes[at], bytes[at + 1]]; };
let model = mod.initialModel();
let cmd;
[model, cmd] = step(model, { kind: "load" });
line("f0", cmd);
let t = routeTags(cmd);
[model, cmd] = step(model, { kind: kinds[t[0]], body: te.encode("disk!") });
line("f1", model.data);
[model, cmd] = step(model, { kind: "save" });
line("f2", cmd);
t = routeTags(cmd);
[model, cmd] = step(model, { kind: kinds[t[0]] });
line("f3", model.saved);
[model, cmd] = step(model, { kind: "save" });
t = routeTags(cmd);
[model, cmd] = step(model, { kind: kinds[t[1]], why: te.encode("io_failed") });
line("f4", model.errs);
line("f5", model.lastErr);
[model, cmd] = step(model, { kind: "copy" });
line("f6", cmd);
[model, cmd] = step(model, { kind: "paste" });
line("f7", cmd);
t = routeTags(cmd);
[model, cmd] = step(model, { kind: kinds[t[0]], body: new Uint8Array(0) });
line("f8", model.data);
[model, cmd] = step(model, { kind: "paste" });
t = routeTags(cmd);
[model, cmd] = step(model, { kind: kinds[t[1]], why: te.encode("failed") });
line("f9", model.errs);
line("f10", model.lastErr);
}
`,
zig: `
{
const Host = struct {
// ok/err tags sit right after the key on every routed head.
fn routeTags(bytes: []const u8) [2]u8 {
var at: usize = 1;
at += 1 + bytes[at];
return .{ bytes[at], bytes[at + 1] };
}
};
const loaded_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).loaded);
const wrote_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).wrote);
var model = m.initialModel();
var r = m.update(model, .load);
model = r.model;
row("f0", r.cmd);
var t = Host.routeTags(r.cmd);
r = m.update(model, if (t[0] == loaded_tag) m.Msg{ .loaded = "disk!" } else m.Msg{ .failed = "?" });
model = r.model;
row("f1", model.data);
r = m.update(model, .save);
model = r.model;
row("f2", r.cmd);
t = Host.routeTags(r.cmd);
r = m.update(model, if (t[0] == wrote_tag) m.Msg.wrote else m.Msg{ .failed = "?" });
model = r.model;
row("f3", model.saved);
r = m.update(model, .save);
model = r.model;
t = Host.routeTags(r.cmd);
r = m.update(model, if (t[1] == @intFromEnum(std.meta.Tag(m.Msg).failed)) m.Msg{ .failed = "io_failed" } else m.Msg.wrote);
model = r.model;
row("f4", model.errs);
row("f5", model.lastErr);
r = m.update(model, .copy);
model = r.model;
row("f6", r.cmd);
r = m.update(model, .paste);
model = r.model;
row("f7", r.cmd);
t = Host.routeTags(r.cmd);
r = m.update(model, if (t[0] == loaded_tag) m.Msg{ .loaded = "" } else m.Msg{ .failed = "?" });
model = r.model;
row("f8", model.data);
r = m.update(model, .paste);
model = r.model;
t = Host.routeTags(r.cmd);
r = m.update(model, if (t[1] == @intFromEnum(std.meta.Tag(m.Msg).failed)) m.Msg{ .failed = "failed" } else m.Msg.wrote);
model = r.model;
row("f9", model.errs);
row("f10", model.lastErr);
}
`,
},
{
name: "fetch {status, body} records and one-shot delays under virtual time",
src: `
import { Cmd, asciiBytes } from "@native-sdk/core";
export interface Model { readonly code: number; readonly body: Uint8Array; readonly errs: number; readonly lastErr: Uint8Array; readonly fires: number; readonly lastAt: number; }
export type Msg =
| { readonly kind: "get" }
| { readonly kind: "ping" }
| { readonly kind: "secure" }
| { readonly kind: "wait" }
| { readonly kind: "wait_fast" }
| { readonly kind: "stop" }
| { readonly kind: "fetched"; readonly status: number; readonly body: Uint8Array }
| { readonly kind: "fired"; readonly at: number }
| { readonly kind: "failed"; readonly why: Uint8Array };
export function initialModel(): Model { return { code: -1, body: new Uint8Array(0), errs: 0, lastErr: new Uint8Array(0), fires: 0, lastAt: -1 }; }
export function update(model: Model, msg: Msg): Model | [Model, Cmd<Msg>] {
switch (msg.kind) {
case "get": return [model, Cmd.fetch({ url: asciiBytes("https://api.test/items"), method: "POST", headers: { "x-b": "2", "x-a": "1" }, body: asciiBytes("q=1"), timeoutMs: 750 }, { key: "get", ok: "fetched", err: "failed" })];
case "ping": return [model, Cmd.fetch({ url: model.body }, { ok: "fetched", err: "failed" })];
case "secure": return [model, Cmd.fetch({ url: asciiBytes("https://api.test/private"), headers: { authorization: model.body, "x-static": "yes" } }, { key: "auth", ok: "fetched", err: "failed" })];
case "wait": return [model, Cmd.delay("tick", 100, "fired")];
case "wait_fast": return [model, Cmd.delay("tick", 40, "fired")];
case "stop": return [model, Cmd.cancel("tick")];
case "fetched": return { ...model, code: msg.status, body: msg.body };
case "fired": return { ...model, fires: model.fires + 1, lastAt: msg.at };
case "failed": return { ...model, errs: model.errs + 1, lastErr: msg.why };
}
}
`,
node: `
{
const kinds = ["get", "ping", "secure", "wait", "wait_fast", "stop", "fetched", "fired", "failed"];
const te = new TextEncoder();
const methods = ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"];
// Mirrors of the fetch/delay/cancel wire records (rt.zig). A header
// value is compile-time text (string) or runtime bytes (Uint8Array);
// both encode as the same length-prefixed value field.
const long = (b) => [b.length & 255, (b.length >> 8) & 255, (b.length >> 16) & 255, (b.length >>> 24) & 255, ...b];
const f64le = (v) => { const dv = new DataView(new ArrayBuffer(8)); dv.setFloat64(0, v, true); const out = []; for (let i = 0; i < 8; i++) out.push(dv.getUint8(i)); return out; };
const enc = (cmd) => {
if (cmd.op === "none") return [];
if (cmd.op === "fetch") {
const k = Array.from(te.encode(cmd.key));
const t = cmd.timeoutMs;
const out = [9, k.length, ...k, kinds.indexOf(cmd.okKind), kinds.indexOf(cmd.errKind), methods.indexOf(cmd.method), t & 255, (t >> 8) & 255, (t >> 16) & 255, (t >>> 24) & 255, ...long(Array.from(cmd.url)), cmd.headers.length];
for (const h of cmd.headers) { const n = Array.from(te.encode(h.name)); const v = typeof h.value === "string" ? Array.from(te.encode(h.value)) : Array.from(h.value); out.push(n.length, ...n, ...long(v)); }
out.push(...long(Array.from(cmd.body)));
return out;
}
if (cmd.op === "delay") { const k = Array.from(te.encode(cmd.key)); return [12, k.length, ...k, ...f64le(cmd.afterMs), kinds.indexOf(cmd.msgKind)]; }
if (cmd.op === "cancel") { const k = Array.from(te.encode(cmd.key)); return [6, k.length, ...k]; }
return cmd.cmds.flatMap(enc);
};
const step = (model, msg) => { const r = mod.update(model, msg); return Array.isArray(r) ? [r[0], Uint8Array.from(enc(r[1]))] : [r, new Uint8Array(0)]; };
const routeTags = (bytes) => { let at = 1; at += 1 + bytes[at]; return [bytes[at], bytes[at + 1]]; };
let model = mod.initialModel();
let cmd;
[model, cmd] = step(model, { kind: "get" });
line("g0", cmd);
let t = routeTags(cmd);
[model, cmd] = step(model, { kind: kinds[t[0]], status: 200, body: te.encode("hello") });
line("g1", model.code);
line("g2", model.body);
// A RUNTIME Authorization header value (model.body) rides the same
// record as the literal x-static header, in name-sort order —
// byte-identical under node and native.
[model, cmd] = step(model, { kind: "secure" });
line("s0", cmd);
t = routeTags(cmd);
[model, cmd] = step(model, { kind: kinds[t[0]], status: 201, body: te.encode("hello") });
line("s1", model.code);
line("s2", model.body);
// A dynamic bytes URL flows through the same record.
[model, cmd] = step(model, { kind: "ping" });
line("g3", cmd);
t = routeTags(cmd);
[model, cmd] = step(model, { kind: kinds[t[0]], status: 204, body: new Uint8Array(0) });
line("g4", model.code);
line("g5", model.body);
[model, cmd] = step(model, { kind: "get" });
t = routeTags(cmd);
[model, cmd] = step(model, { kind: kinds[t[1]], why: te.encode("timed_out") });
line("g6", model.errs);
line("g7", model.lastErr);
// Delay under virtual time: arm at now=0 for 100ms, re-arm the live
// key for 40ms (replace), fire once at 40 with the delay's own tag.
[model, cmd] = step(model, { kind: "wait" });
line("d0", cmd);
const tag0 = cmd[cmd.length - 1];
[model, cmd] = step(model, { kind: "wait_fast" });
line("d1", cmd);
const tag1 = cmd[cmd.length - 1];
line("d2", tag0 === tag1);
[model, cmd] = step(model, { kind: kinds[tag1], at: 40 });
line("d3", model.fires);
line("d4", model.lastAt);
// Re-arm then cancel: the delay never fires, nothing routes.
[model, cmd] = step(model, { kind: "wait" });
[model, cmd] = step(model, { kind: "stop" });
line("d5", cmd);
line("d6", model.fires);
}
`,
zig: `
{
const Host = struct {
fn routeTags(bytes: []const u8) [2]u8 {
var at: usize = 1;
at += 1 + bytes[at];
return .{ bytes[at], bytes[at + 1] };
}
};
const fetched_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).fetched);
var model = m.initialModel();
var r = m.update(model, .get);
model = r.model;
row("g0", r.cmd);
var t = Host.routeTags(r.cmd);
r = m.update(model, if (t[0] == fetched_tag) m.Msg{ .fetched = .{ .status = 200, .body = "hello" } } else m.Msg{ .failed = "?" });
model = r.model;
row("g1", model.code);
row("g2", model.body);
r = m.update(model, .secure);
model = r.model;
row("s0", r.cmd);
t = Host.routeTags(r.cmd);
r = m.update(model, if (t[0] == fetched_tag) m.Msg{ .fetched = .{ .status = 201, .body = "hello" } } else m.Msg{ .failed = "?" });
model = r.model;
row("s1", model.code);
row("s2", model.body);
r = m.update(model, .ping);
model = r.model;
row("g3", r.cmd);
t = Host.routeTags(r.cmd);
r = m.update(model, if (t[0] == fetched_tag) m.Msg{ .fetched = .{ .status = 204, .body = "" } } else m.Msg{ .failed = "?" });
model = r.model;
row("g4", model.code);
row("g5", model.body);
r = m.update(model, .get);
model = r.model;
t = Host.routeTags(r.cmd);
r = m.update(model, if (t[1] == @intFromEnum(std.meta.Tag(m.Msg).failed)) m.Msg{ .failed = "timed_out" } else m.Msg{ .failed = "?" });
model = r.model;
row("g6", model.errs);
row("g7", model.lastErr);
r = m.update(model, .wait);
model = r.model;
row("d0", r.cmd);
const tag0 = r.cmd[r.cmd.len - 1];
r = m.update(model, .wait_fast);
model = r.model;
row("d1", r.cmd);
const tag1 = r.cmd[r.cmd.len - 1];
row("d2", tag0 == tag1);
r = m.update(model, if (tag1 == @intFromEnum(std.meta.Tag(m.Msg).fired)) m.Msg{ .fired = 40 } else m.Msg{ .failed = "?" });
model = r.model;
row("d3", model.fires);
row("d4", model.lastAt);
r = m.update(model, .wait);
model = r.model;
r = m.update(model, .stop);
model = r.model;
row("d5", r.cmd);
row("d6", model.fires);
}
`,
},
{
name: "spawn streams and audio events under the virtual host: ordering, cancel mid-stream, collect",
src: `
import { Cmd, asciiBytes } from "@native-sdk/core";
export type AudioState = "loaded" | "position" | "completed" | "failed" | "rejected" | "spectrum";
export interface Model {
readonly lines: number; readonly last: Uint8Array; readonly code: number; readonly out: Uint8Array;
readonly errs: number; readonly lastErr: Uint8Array;
readonly state: AudioState; readonly pos: number; readonly dur: number; readonly playing: boolean;
readonly bands: Uint8Array; readonly events: number;
}
export type Msg =
| { readonly kind: "sample" }
| { readonly kind: "gather" }
| { readonly kind: "halt" }
| { readonly kind: "play" }
| { readonly kind: "drive" }
| { readonly kind: "line"; readonly text: Uint8Array }
| { readonly kind: "done"; readonly code: number }
| { readonly kind: "sampled"; readonly code: number; readonly output: Uint8Array }
| { readonly kind: "audio_evt"; readonly state: AudioState; readonly positionMs: number; readonly durationMs: number; readonly playing: boolean; readonly buffering: boolean; readonly bands: Uint8Array }
| { readonly kind: "failed"; readonly why: Uint8Array };
export function initialModel(): Model {
return { lines: 0, last: new Uint8Array(0), code: -1, out: new Uint8Array(0), errs: 0, lastErr: new Uint8Array(0), state: "rejected", pos: -1, dur: -1, playing: false, bands: new Uint8Array(0), events: 0 };
}
export function update(model: Model, msg: Msg): Model | [Model, Cmd<Msg>] {
switch (msg.kind) {
case "sample": return [model, Cmd.spawn([asciiBytes("/bin/probe"), asciiBytes("--cpu")], { key: "job", stdin: model.last, line: "line", exit: "done", err: "failed" })];
case "gather": return [model, Cmd.spawn([asciiBytes("/bin/gather")], { key: "job", collect: true, exit: "sampled", err: "failed" })];
case "halt": return [model, Cmd.cancel("job")];
case "play": return [model, Cmd.audioPlay("track", { path: asciiBytes("a.mp3"), url: asciiBytes("https://c.test/a.mp3"), cachePath: asciiBytes("cache/a"), expectedBytes: 2048 }, { event: "audio_evt" })];
case "drive": return [model, Cmd.batch([Cmd.audioPause("track"), Cmd.audioSeek("track", 30000), Cmd.audioSetVolume("track", 0.5), Cmd.audioStop("track")])];
case "line": return { ...model, lines: model.lines + 1, last: msg.text };
case "done": return { ...model, code: msg.code };
case "sampled": return { ...model, code: msg.code, out: msg.output };
case "audio_evt": return { ...model, state: msg.state, pos: msg.positionMs, dur: msg.durationMs, playing: msg.playing, bands: msg.bands, events: model.events + 1 };
case "failed": return { ...model, errs: model.errs + 1, lastErr: msg.why };
}
}
`,
node: `
{
const kinds = ["sample", "gather", "halt", "play", "drive", "line", "done", "sampled", "audio_evt", "failed"];
const states = ["loaded", "position", "completed", "failed", "rejected", "spectrum"];
const te = new TextEncoder();
// Mirrors of the streaming wire records (rt.zig).
const long = (b) => [b.length & 255, (b.length >> 8) & 255, (b.length >> 16) & 255, (b.length >>> 24) & 255, ...b];
const f64le = (v) => { const dv = new DataView(new ArrayBuffer(8)); dv.setFloat64(0, v, true); const out = []; for (let i = 0; i < 8; i++) out.push(dv.getUint8(i)); return out; };
const verbs = ["pause", "resume", "stop", "seek", "volume"];
const enc = (cmd) => {
if (cmd.op === "none") return [];
if (cmd.op === "cancel") { const k = Array.from(te.encode(cmd.key)); return [6, k.length, ...k]; }
if (cmd.op === "spawn") {
const k = Array.from(te.encode(cmd.key));
const lineTag = cmd.lineKind === "" ? 0xff : kinds.indexOf(cmd.lineKind);
const out = [13, k.length, ...k, lineTag, kinds.indexOf(cmd.exitKind), kinds.indexOf(cmd.errKind), cmd.collect ? 1 : 0, cmd.argv.length];
for (const arg of cmd.argv) out.push(...long(Array.from(arg)));
out.push(...long(Array.from(cmd.stdin)));
return out;
}
if (cmd.op === "audio_play") {
const k = Array.from(te.encode(cmd.key));
return [14, k.length, ...k, kinds.indexOf(cmd.eventKind), ...long(Array.from(cmd.path)), ...long(Array.from(cmd.url)), ...long(Array.from(cmd.cachePath)), ...f64le(cmd.expectedBytes)];
}
if (cmd.op === "audio_ctl") {
const k = Array.from(te.encode(cmd.key));
return [15, k.length, ...k, verbs.indexOf(cmd.verb), ...f64le(cmd.value)];
}
return cmd.cmds.flatMap(enc);
};
const step = (model, msg) => { const r = mod.update(model, msg); return Array.isArray(r) ? [r[0], Uint8Array.from(enc(r[1]))] : [r, new Uint8Array(0)]; };
// The virtual host reads a spawn record's routing tags off the wire:
// [op][key][line][exit][err] — the canned scripts below dispatch arms
// built from exactly these bytes, mirroring the zig driver.
const spawnTags = (bytes) => { let at = 1; at += 1 + bytes[at]; return { line: bytes[at], exit: bytes[at + 1], err: bytes[at + 2] }; };
const audioTag = (bytes) => { let at = 1; at += 1 + bytes[at]; return bytes[at]; };
let model = mod.initialModel();
let cmd;
// Audio stream: play opens it; a canned event script drives the arm.
[model, cmd] = step(model, { kind: "play" });
line("a0", cmd);
const evTag = audioTag(cmd);
const bands0 = new Uint8Array(32);
const ev = (state, positionMs, durationMs, playing, buffering, bands) => ({ kind: kinds[evTag], state, positionMs, durationMs, playing, buffering, bands });
[model, cmd] = step(model, ev("loaded", 0, 180000, true, false, bands0));
line("a1", model.state);
line("a2", model.dur);
line("a3", model.playing);
[model, cmd] = step(model, ev("position", 500, 180000, true, false, bands0));
line("a4", model.pos);
const bands = Uint8Array.from({ length: 32 }, (_, i) => i * 5);
[model, cmd] = step(model, ev("spectrum", 750, 180000, true, false, bands));
line("a5", model.bands);
line("a6", model.events);
[model, cmd] = step(model, { kind: "drive" });
line("a7", cmd);
// Line spawn: lines route across dispatches in order, then cancel
// mid-stream delivers the err arm — never silent.
[model, cmd] = step(model, { kind: "sample" });
line("s0", cmd);
const t = spawnTags(cmd);
[model, cmd] = step(model, { kind: kinds[t.line], text: te.encode("cpu 40") });
line("s1", model.lines);
line("s2", model.last);
[model, cmd] = step(model, { kind: kinds[t.line], text: te.encode("cpu 7") });
line("s3", model.lines);
[model, cmd] = step(model, { kind: "halt" });
line("s4", cmd);
[model, cmd] = step(model, { kind: kinds[t.err], why: te.encode("cancelled") });
line("s5", model.errs);
line("s6", model.lastErr);
// The key is free again: a fresh stream exits cleanly with its code.
[model, cmd] = step(model, { kind: "sample" });
line("s7", cmd);
[model, cmd] = step(model, { kind: kinds[t.exit], code: 3 });
line("s8", model.code);
// Collect spawn: the exit carries { code, output } whole.
[model, cmd] = step(model, { kind: "gather" });
line("g0", cmd);
const tc = spawnTags(cmd);
[model, cmd] = step(model, { kind: kinds[tc.exit], code: 0, output: te.encode("PID CPU\\n17 99.0\\n") });
line("g1", model.code);
line("g2", model.out);
}
`,
zig: `
{
const Host = struct {
fn spawnTags(bytes: []const u8) [3]u8 {
var at: usize = 1;
at += 1 + bytes[at];
return .{ bytes[at], bytes[at + 1], bytes[at + 2] };
}
fn audioTag(bytes: []const u8) u8 {
var at: usize = 1;
at += 1 + bytes[at];
return bytes[at];
}
};
const line_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).line);
const done_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).done);
const sampled_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).sampled);
const audio_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).audio_evt);
const failed_tag: u8 = @intFromEnum(std.meta.Tag(m.Msg).failed);
var model = m.initialModel();
var r = m.update(model, .play);
model = r.model;
row("a0", r.cmd);
const ev_tag = Host.audioTag(r.cmd);
const bands0 = [_]u8{0} ** 32;
r = m.update(model, if (ev_tag == audio_tag) m.Msg{ .audio_evt = .{ .state = .loaded, .positionMs = 0, .durationMs = 180000, .playing = true, .buffering = false, .bands = &bands0 } } else m.Msg{ .failed = "?" });
model = r.model;
row("a1", model.state);
row("a2", model.dur);
row("a3", model.playing);
r = m.update(model, .{ .audio_evt = .{ .state = .position, .positionMs = 500, .durationMs = 180000, .playing = true, .buffering = false, .bands = &bands0 } });
model = r.model;
row("a4", model.pos);
var bands: [32]u8 = undefined;
for (&bands, 0..) |*b, i| b.* = @intCast(i * 5);
r = m.update(model, .{ .audio_evt = .{ .state = .spectrum, .positionMs = 750, .durationMs = 180000, .playing = true, .buffering = false, .bands = &bands } });
model = r.model;
row("a5", model.bands);
row("a6", model.events);
r = m.update(model, .drive);
model = r.model;
row("a7", r.cmd);
r = m.update(model, .sample);
model = r.model;
row("s0", r.cmd);
const t = Host.spawnTags(r.cmd);
r = m.update(model, if (t[0] == line_tag) m.Msg{ .line = "cpu 40" } else m.Msg{ .failed = "?" });
model = r.model;
row("s1", model.lines);
row("s2", model.last);
r = m.update(model, if (t[0] == line_tag) m.Msg{ .line = "cpu 7" } else m.Msg{ .failed = "?" });
model = r.model;
row("s3", model.lines);
r = m.update(model, .halt);
model = r.model;
row("s4", r.cmd);
r = m.update(model, if (t[2] == failed_tag) m.Msg{ .failed = "cancelled" } else m.Msg{ .failed = "?" });
model = r.model;
row("s5", model.errs);
row("s6", model.lastErr);
r = m.update(model, .sample);
model = r.model;
row("s7", r.cmd);
r = m.update(model, if (t[1] == done_tag) m.Msg{ .done = 3 } else m.Msg{ .failed = "?" });
model = r.model;
row("s8", model.code);
r = m.update(model, .gather);
model = r.model;
row("g0", r.cmd);
const tc = Host.spawnTags(r.cmd);
r = m.update(model, if (tc[1] == sampled_tag) m.Msg{ .sampled = .{ .code = 0, .output = "PID CPU\\n17 99.0\\n" } } else m.Msg{ .failed = "?" });
model = r.model;
row("g1", model.code);
row("g2", model.out);
}
`,
},
{
name: "declared text-input mirror union: payload arms, stacked verbs, byte-splice reducer",
src: `
export type TextCaretDirection = "previous" | "next" | "previous_word" | "next_word" | "start" | "end";
export interface TextCaretMove { readonly direction: TextCaretDirection; readonly extend: boolean; }
export interface TextSelection { readonly anchor: number; readonly focus: number; }
export type TextInputEvent =
| { readonly kind: "insert_text"; readonly text: Uint8Array }
| { readonly kind: "delete_backward" }
| { readonly kind: "delete_forward" }
| { readonly kind: "delete_word_backward" }
| { readonly kind: "delete_word_forward" }
| { readonly kind: "clear" }
| { readonly kind: "move_caret"; readonly move: TextCaretMove }
| { readonly kind: "set_selection"; readonly selection: TextSelection }
| { readonly kind: "set_composition"; readonly text: Uint8Array; readonly cursor: number | null }
| { readonly kind: "commit_composition" }
| { readonly kind: "cancel_composition" };
export interface Model { readonly draft: Uint8Array; readonly moves: number; }
export type Msg =
| { readonly kind: "draft_edit"; readonly edit: TextInputEvent }
| { readonly kind: "reset" };
function applyDraftEdit(draft: Uint8Array, edit: TextInputEvent): Uint8Array {
switch (edit.kind) {
case "insert_text": {
const out = new Uint8Array(draft.length + edit.text.length);
out.set(draft, 0);
out.set(edit.text, draft.length);
return out;
}
case "delete_backward":
return draft.length === 0 ? draft : draft.subarray(0, draft.length - 1);
case "clear":
return new Uint8Array(0);
case "delete_forward":
case "delete_word_backward":
case "delete_word_forward":
case "move_caret":
case "set_selection":
case "set_composition":
case "commit_composition":
case "cancel_composition":
return draft;
}
}
export function update(model: Model, msg: Msg): Model {
switch (msg.kind) {
case "draft_edit":
return { draft: applyDraftEdit(model.draft, msg.edit), moves: model.moves + 1 };
case "reset":
return { draft: new Uint8Array(0), moves: 0 };
}
}
export function initialModel(): Model { return { draft: new Uint8Array(0), moves: 0 }; }
`,
node: `
{
const te = new TextEncoder();
let model = mod.initialModel();
const edits = [
{ kind: "insert_text", text: te.encode("hi") },
{ kind: "insert_text", text: te.encode(" there") },
{ kind: "delete_backward" },
{ kind: "move_caret", move: { direction: "previous_word", extend: true } },
{ kind: "set_selection", selection: { anchor: 1, focus: 3 } },
{ kind: "set_composition", text: te.encode("x"), cursor: null },
{ kind: "delete_forward" },
{ kind: "clear" },
{ kind: "insert_text", text: te.encode("z") },
];
for (const edit of edits) {
model = mod.update(model, { kind: "draft_edit", edit: edit });
line("d", model.draft);
line("m", model.moves);
}
model = mod.update(model, { kind: "reset" });
line("d2", model.draft);
line("m2", model.moves);
}
`,
zig: `
{
m.rt.resetAll();
var model = m.commitModelRoot(m.initialModel());
m.rt.frameReset();
const edits = [_]m.TextInputEvent{
.{ .insert_text = "hi" },
.{ .insert_text = " there" },
.delete_backward,
.{ .move_caret = .{ .direction = .previous_word, .extend = true } },
.{ .set_selection = .{ .anchor = 1, .focus = 3 } },
.{ .set_composition = .{ .text = "x", .cursor = null } },
.delete_forward,
.clear,
.{ .insert_text = "z" },
};
for (edits) |edit| {
model = m.commitModelRoot(m.update(model, .{ .draft_edit = edit }));
m.rt.frameReset();
row("d", model.draft);
row("m", model.moves);
}
model = m.commitModelRoot(m.update(model, .reset));
m.rt.frameReset();
row("d2", model.draft);
row("m2", model.moves);
}
`,
},
{
name: "multi-file core: cross-file helpers/consts and the SDK text engine agree with node",
src: `
import { applyTextInputEvent, containsIgnoreCase, trimAsciiSpaces, type TextEditState, type TextInputEvent } from "@native-sdk/core/text";
import { STEP, scaled, splitPoint } from "./util.ts";
export function typed(seed: Uint8Array, insert: Uint8Array, caret: number): Uint8Array {
const state: TextEditState = { text: seed, selection: { anchor: caret, focus: caret }, composition: null };
const event: TextInputEvent = { kind: "insert_text", text: insert };
const next = applyTextInputEvent(state, event, 16);
if (next === null) return seed;
return next.text;
}
export function wordDeleted(seed: Uint8Array, caret: number): Uint8Array {
const state: TextEditState = { text: seed, selection: { anchor: caret, focus: caret }, composition: null };
const event: TextInputEvent = { kind: "delete_word_backward" };
const next = applyTextInputEvent(state, event, 64);
if (next === null) return seed;
return next.text;
}
export function caretAfterHome(seed: Uint8Array, caret: number): number {
const state: TextEditState = { text: seed, selection: { anchor: caret, focus: caret }, composition: null };
const event: TextInputEvent = { kind: "move_caret", move: { direction: "start", extend: false } };
const next = applyTextInputEvent(state, event, 64);
if (next === null) return caret;
return next.selection.focus;
}
export function matches(hay: Uint8Array, needle: Uint8Array): boolean {
return containsIgnoreCase(trimAsciiSpaces(hay), needle);
}
export function stepped(n: number): number {
return scaled(n) + STEP;
}
export function pivot(xs: Uint8Array): number {
return splitPoint(xs);
}
`,
files: {
"util.ts": `
export const STEP = 7;
export function scaled(n: number): number {
return n * 3;
}
export function splitPoint(bytes: Uint8Array): number {
let i = 0;
while (i < bytes.length && bytes[i] !== 0x2c) i += 1;
return i;
}
`,
},
calls: [
// Insert mid-text (caret 2 of "hello"), and an over-capacity refusal.
{ fn: "typed", args: [{ t: "bytes", v: [0x68, 0x65, 0x6c, 0x6c, 0x6f] }, { t: "bytes", v: [0x2d, 0x2d] }, i(2)] },
{ fn: "typed", args: [{ t: "bytes", v: [0x68, 0x65, 0x6c, 0x6c, 0x6f] }, { t: "bytes", v: [0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61] }, i(5)] },
// Word-delete from the end of "one two", and from inside a word.
{ fn: "wordDeleted", args: [{ t: "bytes", v: [0x6f, 0x6e, 0x65, 0x20, 0x74, 0x77, 0x6f] }, i(7)] },
{ fn: "wordDeleted", args: [{ t: "bytes", v: [0x6f, 0x6e, 0x65, 0x20, 0x74, 0x77, 0x6f] }, i(5)] },
{ fn: "caretAfterHome", args: [{ t: "bytes", v: [0x61, 0x62, 0x63] }, i(2)] },
// ASCII case-insensitive contains over a trimmed haystack.
{ fn: "matches", args: [{ t: "bytes", v: [0x20, 0x48, 0x65, 0x4c, 0x6c, 0x4f, 0x20] }, { t: "bytes", v: [0x65, 0x6c, 0x6c] }] },
{ fn: "matches", args: [{ t: "bytes", v: [0x20, 0x48, 0x65, 0x4c, 0x6c, 0x4f, 0x20] }, { t: "bytes", v: [0x7a] }] },
// Cross-file const + helper, and a cross-file byte scan.
{ fn: "stepped", args: [i(5)] },
{ fn: "pivot", args: [{ t: "bytes", v: [0x61, 0x62, 0x2c, 0x63] }] },
{ fn: "pivot", args: [{ t: "bytes", v: [0x61, 0x62] }] },
],
},
{
name: "do-while runs its body before the first test; continue jumps to the test",
src: `
export function runsOnce(n: number): number {
let i = 0;
let total = 0;
do { total += 1; i += 1; } while (i < n);
return total;
}
export function evenHits(limit: number): number {
let m = 0;
let hits = 0;
do {
m += 1;
if (m % 2 === 1) continue;
hits += 1;
} while (m < limit);
return hits;
}
export function drains(xs: Uint8Array): number {
let idx = 0;
let total = 0;
do {
if (idx >= xs.length) break;
total += xs[idx];
idx += 1;
} while (true);
return total;
}`,
calls: [
{ fn: "runsOnce", args: [i(0)] }, // body-first: runs once even when the test is false
{ fn: "runsOnce", args: [i(3)] },
{ fn: "evenHits", args: [i(5)] },
{ fn: "evenHits", args: [i(0)] },
{ fn: "drains", args: [{ t: "bytes", v: [3, 4, 5] }] },
{ fn: "drains", args: [{ t: "bytes", v: [] }] },
],
},
{
name: "labeled continue re-enters the labeled loop; labeled break exits it; labeled blocks break forward",
src: `
export function grid(): number {
let acc = 0;
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (j === 1) continue outer;
acc += i * 10 + j;
}
}
return acc;
}
export function firstPair(xs: Uint8Array, ys: Uint8Array, want: number): number {
let found = -1;
scan: for (const x of xs) {
for (const y of ys) {
if (x + y === want) { found = x * 100 + y; break scan; }
}
}
return found;
}
export function gated(b: boolean): number {
let acc = 0;
work: {
acc += 1;
if (b) break work;
acc += 10;
}
return acc;
}
export function labeledWhile(n: number): number {
let m = 0;
let spins = 0;
pump: while (spins < 50) {
spins += 1;
if (m >= n) break pump;
m += 2;
continue pump;
}
return m + spins;
}`,
calls: [
{ fn: "grid", args: [] },
{ fn: "firstPair", args: [{ t: "bytes", v: [1, 2, 3] }, { t: "bytes", v: [7, 5] }, i(8)] },
{ fn: "firstPair", args: [{ t: "bytes", v: [1, 2] }, { t: "bytes", v: [1] }, i(99)] },
{ fn: "gated", args: [{ t: "b", v: true }] },
{ fn: "gated", args: [{ t: "b", v: false }] },
{ fn: "labeledWhile", args: [i(5)] },
{ fn: "labeledWhile", args: [i(0)] },
],
},
{
name: "** matches JS pow exactly: right-associativity, the NaN-exponent and +-1**Infinity corners, fractional results",
src: `
export function pow(a: number, b: number): number { return a ** b; }
export function towers(): number { return 2 ** 3 ** 2; }
export function squared(x: number): number { let v = x; v **= 2; return v; }`,
calls: [
{ fn: "pow", args: [f(3), f(4)] },
{ fn: "pow", args: [f(2), f(-2)] }, // 0.25 — float always
{ fn: "pow", args: [f(1), f("nan")] }, // JS: NaN (libm says 1)
{ fn: "pow", args: [f("nan"), f(0)] }, // JS: 1
{ fn: "pow", args: [f(1), f("inf")] }, // JS: NaN
{ fn: "pow", args: [f(-1), f("-inf")] }, // JS: NaN
{ fn: "pow", args: [f(0), f(-1)] }, // Infinity
{ fn: "pow", args: [f("-0"), f(-1)] }, // -Infinity
{ fn: "pow", args: [f(-2), f(0.5)] }, // NaN
{ fn: "pow", args: [f(-2), f(3)] }, // -8
{ fn: "towers", args: [] }, // 512, not 64
{ fn: "squared", args: [f(3)] },
{ fn: "squared", args: [f(-0.5)] },
],
},
{
name: "shifts wrap to 32 bits with the count masked, >>> is unsigned, ~ is ToInt32 not",
src: `
export function shl(a: number, b: number): number {
let x = 0; let n = 0;
x = a | 0; n = b | 0;
return x << n;
}
export function shr(a: number, b: number): number {
let x = 0; let n = 0;
x = a | 0; n = b | 0;
return x >> n;
}
export function ushr(a: number, b: number): number {
let x = 0; let n = 0;
x = a | 0; n = b | 0;
return x >>> n;
}
export function bitNot(a: number): number {
let x = 0;
x = a | 0;
return ~x;
}
export function shiftCompound(a: number): number {
let v = 0;
v = a | 0;
v <<= 3;
v >>= 1;
v >>>= 1;
return v;
}`,
calls: [
{ fn: "shl", args: [i(1), i(35)] }, // count masked & 31 -> 8
{ fn: "shl", args: [i(5), i(31)] }, // wraps to -2147483648
{ fn: "shl", args: [i(5), i(-1)] }, // count -1 & 31 = 31
{ fn: "shr", args: [i(-9), i(1)] }, // arithmetic: -5
{ fn: "ushr", args: [i(-1), i(0)] }, // 4294967295
{ fn: "ushr", args: [i(-9), i(1)] }, // 2147483643
{ fn: "bitNot", args: [i(5)] }, // -6
{ fn: "bitNot", args: [i(-1)] }, // 0
{ fn: "shiftCompound", args: [i(-3)] },
{ fn: "shiftCompound", args: [i(1000)] },
],
},
{
name: "compound assignments equal their x = x op v spellings; logical forms guard the assignment",
src: `
export function arith(a: number): number {
let v = a;
v *= 3;
v -= 1;
v %= 7;
return v;
}
export function floaty(a: number): number {
let v = a;
v /= 4;
v *= 0.5;
return v;
}
export function bitwise(a: number): number {
let v = 0;
v = a | 0;
v &= 255;
v |= 16;
v ^= 3;
return v;
}
export function logicals(a: boolean, b: boolean): boolean {
let x = a;
x &&= b;
x ||= !b;
return x;
}
export function nullish(n: number | null): number {
let v = n;
v ??= 42;
return v ?? -1;
}`,
calls: [
{ fn: "arith", args: [f(6)] },
{ fn: "arith", args: [f(-6)] }, // (-17) % 7 = -3 (truncated, keeps sign)
{ fn: "floaty", args: [f(3)] }, // 0.375
{ fn: "floaty", args: [f("-0")] }, // -0 preserved
{ fn: "bitwise", args: [i(300)] },
{ fn: "bitwise", args: [i(-2)] },
{ fn: "logicals", args: [{ t: "b", v: true }, { t: "b", v: false }] },
{ fn: "logicals", args: [{ t: "b", v: false }, { t: "b", v: true }] },
{ fn: "logicals", args: [{ t: "b", v: true }, { t: "b", v: true }] },
{ fn: "nullish", args: [{ t: "null" }] },
{ fn: "nullish", args: [f(7)] },
{ fn: "nullish", args: [f(0)] }, // 0 is NOT nullish: stays 0
],
},
{
name: "a default arm on a union-kind switch matches exactly the uncovered kinds",
src: `
export type Msg =
| { readonly kind: "add"; readonly v: number }
| { readonly kind: "sub"; readonly v: number }
| { readonly kind: "reset" }
| { readonly kind: "noop" };
export function apply(sel: number, v: number, acc: number): number {
const msg: Msg =
sel === 0 ? { kind: "add", v: v } : sel === 1 ? { kind: "sub", v: v } : sel === 2 ? { kind: "reset" } : { kind: "noop" };
switch (msg.kind) {
case "add": return acc + msg.v;
default: return -1000;
}
}
function pickSmall(sel: number): Msg {
return sel === 0 ? { kind: "reset" } : { kind: "noop" };
}
export function applyCovered(sel: number, acc: number): number {
const msg = pickSmall(sel);
// Every kind written out plus a default: the default is JS dead code.
switch (msg.kind) {
case "add": return acc + 1;
case "sub": return acc - 1;
case "reset": return 0;
case "noop": return acc;
default: return -1000;
}
}`,
calls: [
{ fn: "apply", args: [i(0), f(5), f(10)] },
{ fn: "apply", args: [i(1), f(5), f(10)] },
{ fn: "apply", args: [i(2), f(5), f(10)] },
{ fn: "apply", args: [i(3), f(5), f(10)] },
{ fn: "applyCovered", args: [i(0), f(9)] },
{ fn: "applyCovered", args: [i(1), f(9)] },
],
},
{
name: "multi-declaration for-inits and comma incrementors step every counter per iteration",
src: `
export function meet(n: number): number {
let acc = 0;
for (let lo = 0, hi = n; lo < hi; lo++, hi--) {
acc += 1;
}
return acc;
}
export function weave(xs: Uint8Array): number {
let sum = 0;
for (let a = 0, b = xs.length - 1; a < b; a += 1, b -= 1) {
sum += xs[a] * 10 + xs[b];
}
return sum;
}
export function countdown(n: number): number {
let acc = 0;
for (let i = n; i > 0; i--) acc += i;
return acc;
}`,
calls: [
{ fn: "meet", args: [i(6)] },
{ fn: "meet", args: [i(7)] },
{ fn: "meet", args: [i(0)] },
{ fn: "weave", args: [{ t: "bytes", v: [1, 2, 3, 4] }] },
{ fn: "weave", args: [{ t: "bytes", v: [5] }] },
{ fn: "countdown", args: [i(4)] },
{ fn: "countdown", args: [i(0)] },
],
},
{
name: "const record destructuring aliases fields exactly (renames, bytes, optionals, float classes)",
src: `
export interface Stats {
readonly total: number;
readonly done: number;
readonly ratio: number;
readonly label: Uint8Array;
readonly last: number | null;
}
function build(total: number, done: number, ratio: number, label: Uint8Array, last: number | null): Stats {
return { total: total, done: done, ratio: ratio, label: label, last: last };
}
export function summary(total: number, done: number, ratio: number, label: Uint8Array, last: number | null): number {
const stats = build(total, done, ratio, label, last);
const { total: totalCount, done: doneCount, ratio: r, last: l } = stats;
if (totalCount === 0) return -1;
return doneCount + r * 2 + (l ?? 0) * 100 + totalCount;
}
export function tagByte(label: Uint8Array): number {
const stats = build(1, 0, 0, label, null);
const { label: tag } = stats;
if (tag.length === 0) return -1;
return tag[0];
}`,
calls: [
{ fn: "summary", args: [f(4), f(2), f(0.25), { t: "bytes", v: [7] }, f(3)] },
{ fn: "summary", args: [f(0), f(2), f(0.25), { t: "bytes", v: [7] }, { t: "null" }] },
{ fn: "summary", args: [f(4), f(2), f(0.25), { t: "bytes", v: [7] }, { t: "null" }] },
{ fn: "tagByte", args: [{ t: "bytes", v: [65, 66] }] },
{ fn: "tagByte", args: [{ t: "bytes", v: [] }] },
],
},
{
name: "unary plus is the identity on numbers (NaN and -0 included); ; is a no-op",
src: `
export function idPlus(x: number): number { return +x; }
export function stepped(x: number): number { ; let v = +x + 1; ; return v; }`,
calls: [
{ fn: "idPlus", args: [f(5)] },
{ fn: "idPlus", args: [f("nan")] },
{ fn: "idPlus", args: [f("-0")] },
{ fn: "idPlus", args: [f("-inf")] },
{ fn: "stepped", args: [f(2.5)] },
],
},
{
name: "namespace imports alias the target module exactly: values, calls, and qualified types",
files: {
"util.ts": `
export interface Cfg { readonly step: number; readonly scale: number; }
export const SEED = 7;
export function bump(n: number, c: Cfg): number { return n + c.step * c.scale; }
export function half(x: number): number { return x / 2; }`,
},
src: `
import * as util from "./util.ts";
export function seeded(): number { return util.SEED; }
export function stepped(n: number): number {
const cfg: util.Cfg = { step: 2, scale: 3 };
return util.bump(n, cfg);
}
export function halved(x: number): number { return util.half(x); }`,
calls: [
{ fn: "seeded", args: [] },
{ fn: "stepped", args: [f(10)] },
{ fn: "halved", args: [f(5)] }, // 2.5 — the float class crosses the alias
{ fn: "halved", args: [f("-0")] },
],
},
{
name: "entries loop: [i, x] pair over arrays and bytes (index and element agree with node)",
src: `
export function weighted(xs: readonly number[]): number {
let t = 0;
for (const [i, x] of xs.entries()) { t += (i + 1) * x; }
return t;
}
export function firstMatchIndex(bs: Uint8Array, want: number): number {
for (const [i, b] of bs.entries()) { if (b === want) return i; }
return -1;
}
`,
calls: [
{ fn: "weighted", args: [{ t: "nums", v: [2, 3.5, "-0"] }] },
{ fn: "weighted", args: [{ t: "nums", v: [] }] },
{ fn: "firstMatchIndex", args: [{ t: "bytes", v: [9, 4, 4] }, i(4)] },
{ fn: "firstMatchIndex", args: [{ t: "bytes", v: [9] }, i(4)] },
],
},
{
name: "steps in value position: arr[i++] scan order, pre-step value, assignment value",
src: `
export function everyOther(bs: Uint8Array): number {
let i = 0;
let t = 0;
while (i < bs.length) { t = t * 100 + bs[i++]; i++; }
return t;
}
export function preStep(): number {
let count = 4;
const n = ++count;
return n * 10 + count;
}
export function assignValue(x: number): number {
let y = 0;
const z = (y = x);
const w = (y += 2);
return z + w * 1000 + y;
}
`,
calls: [
{ fn: "everyOther", args: [{ t: "bytes", v: [1, 2, 3, 4, 5] }] },
{ fn: "everyOther", args: [{ t: "bytes", v: [] }] },
{ fn: "preStep", args: [] },
{ fn: "assignValue", args: [f(7)] },
{ fn: "assignValue", args: [f("-0")] },
],
},
{
name: "optional chains: element hops, method hops, and the ?? fold",
src: `
export interface M { readonly xs: Uint8Array; }
export function firstByte(m: M | null): number { return m?.xs[0] ?? -1; }
export function second(xs: readonly number[] | null): number { return xs?.[1] ?? -1; }
export function hasThree(xs: readonly number[] | null): boolean { return xs?.includes(3) ?? false; }
export function windowLen(xs: readonly number[] | null): number {
const w = xs?.slice(1, 9);
if (w === undefined) return -1;
return w.length;
}
`,
node: `
line("m_hit", mod.firstByte({ xs: Uint8Array.from([7, 8]) }));
line("m_null", mod.firstByte(null));
line("el_hit", mod.second([4, 5, 6]));
line("el_null", mod.second(null));
line("inc_hit", mod.hasThree([1, 3]));
line("inc_null", mod.hasThree(null));
line("win_hit", mod.windowLen([1, 2, 3]));
line("win_null", mod.windowLen(null));
`,
zig: `
row("m_hit", m.firstByte(.{ .xs = &[_]u8{ 7, 8 } }));
row("m_null", m.firstByte(null));
row("el_hit", m.second(&[_]f64{ 4, 5, 6 }));
row("el_null", m.second(null));
row("inc_hit", m.hasThree(&[_]f64{ 1, 3 }));
row("inc_null", m.hasThree(null));
row("win_hit", m.windowLen(&[_]f64{ 1, 2, 3 }));
row("win_null", m.windowLen(null));
`,
},
{
name: "plain switch: strict equality, case order, mid-position default, gaps",
src: `
export function grade(n: number): number {
switch (n) {
case 1: return 10;
default: return -1;
case 2:
case 3: return 23;
}
}
export function gapped(n: number): number {
let out = 0;
switch (n) {
case 5: out = 50; break;
case 6: out = 60; break;
}
return out;
}
export function tagOf(s: string): number {
switch (s) { case "a": return 1; case "b": return 2; default: return 0; }
}
`,
calls: [
{ fn: "grade", args: [f(1)] },
{ fn: "grade", args: [f(2)] },
{ fn: "grade", args: [f(3)] },
{ fn: "grade", args: [f(9)] },
{ fn: "grade", args: [f("nan")] },
{ fn: "grade", args: [f("-0")] },
{ fn: "grade", args: [f(2.5)] },
{ fn: "gapped", args: [f(5)] },
{ fn: "gapped", args: [f(7)] },
{ fn: "tagOf", args: [{ t: "str", v: "b" }] },
{ fn: "tagOf", args: [{ t: "str", v: "zz" }] },
],
},
{
name: "generics: monomorphized helpers behave identically under node (records, optionals, floats, recursion)",
src: `
export interface Task { readonly id: number; readonly done: boolean; }
export function pick<T>(xs: readonly T[], idx: number): T { return xs[idx]; }
export function first<T>(xs: readonly T[]): T | null {
return xs.length > 0 ? pick(xs, 0) : null;
}
export function sizeAfter<T>(xs: readonly T[], drop: number): number {
if (drop <= 0) return xs.length;
return sizeAfter(xs.slice(1), drop - 1);
}
export function lastNum(xs: readonly number[]): number { return pick(xs, xs.length - 1); }
export function firstDoneId(tasks: readonly Task[]): number {
const t = first(tasks);
if (t === null) return -1;
return t.done ? t.id : -2;
}
export function shrink(xs: readonly number[], n2: number): number { return sizeAfter(xs, n2); }
`,
node: `
line("last", mod.lastNum([2, 3.5]));
line("last_neg0", mod.lastNum([1, -0]));
line("done", mod.firstDoneId([{ id: 4, done: true }]));
line("not_done", mod.firstDoneId([{ id: 4, done: false }]));
line("empty", mod.firstDoneId([]));
line("shrunk", mod.shrink([9, 9, 9, 9], 3));
`,
zig: `
row("last", m.lastNum(&[_]f64{ 2, 3.5 }));
row("last_neg0", m.lastNum(&[_]f64{ 1, -0.0 }));
row("done", m.firstDoneId(&[_]m.Task{.{ .id = 4, .done = true }}));
row("not_done", m.firstDoneId(&[_]m.Task{.{ .id = 4, .done = false }}));
row("empty", m.firstDoneId(&[_]m.Task{}));
row("shrunk", m.shrink(&[_]f64{ 9, 9, 9, 9 }, 3));
`,
},
{
name: "local function values: hoisted helpers by direct call, callback pass, and recursion",
src: `
export function scaled(xs: readonly number[]): readonly number[] {
const triple = (x: number): number => x * 3;
return xs.map(triple);
}
export function factorial(n: number): number {
const fact = (v: number): number => v <= 1 ? 1 : v * fact(v - 1);
return fact(n);
}
export function applyTwice(x: number): number {
const bump = (v: number): number => v + 1.5;
return bump(bump(x));
}
`,
calls: [
{ fn: "scaled", args: [{ t: "nums", v: [1, 2.5] }] },
{ fn: "factorial", args: [f(5)] },
{ fn: "factorial", args: [f(0)] },
{ fn: "applyTwice", args: [f("-0")] },
{ fn: "applyTwice", args: [f("nan")] },
],
},
{
name: "arrays of byte buffers: push-built parts concatenate byte-identically",
src: `
export function concatAll(parts: readonly Uint8Array[]): Uint8Array {
let total = 0;
for (const p of parts) total += p.length;
const out = new Uint8Array(total);
let off = 0;
for (const p of parts) { out.set(p, off); off += p.length; }
return out;
}
export function joined(a: Uint8Array, b: Uint8Array): Uint8Array {
const parts: Uint8Array[] = [];
parts.push(a);
parts.push(b);
return concatAll(parts);
}
`,
calls: [
{ fn: "joined", args: [{ t: "bytes", v: [1, 2] }, { t: "bytes", v: [3, 4, 5] }] },
{ fn: "joined", args: [{ t: "bytes", v: [] }, { t: "bytes", v: [7] }] },
{ fn: "joined", args: [{ t: "bytes", v: [] }, { t: "bytes", v: [] }] },
],
},
{
name: "bare function references: map/filter/reduce/toSorted callbacks match the arrow forms",
src: `
function double(n: number): number { return n * 2; }
function isPositive(n: number): boolean { return n > 0; }
function add(a: number, b: number): number { return a + b; }
function byAscending(a: number, b: number): number { return a - b; }
export function total(xs: readonly number[]): number {
return xs.map(double).filter(isPositive).reduce(add, 0);
}
export function sorted(xs: readonly number[]): readonly number[] {
return xs.toSorted(byAscending);
}
`,
calls: [
{ fn: "total", args: [{ t: "nums", v: [1.5, -2, 3] }] },
{ fn: "total", args: [{ t: "nums", v: [] }] },
{ fn: "sorted", args: [{ t: "nums", v: [3, "-0", 1.25, 2] }] },
{ fn: "sorted", args: [{ t: "nums", v: [] }] },
],
},
{
name: "data classes: constructor defaults, mutating methods, field reads match node",
src: `
export class Counter {
count: number = 0;
step: number;
constructor(step: number) { this.step = step; }
bump(): void { this.count += this.step; }
scaled(by: number): number { return this.count * by; }
}
export class Accumulator {
values: readonly number[] = [];
push(v: number): void { this.values = [...this.values, v]; }
total(): number {
let sum = 0;
for (const v of this.values) sum += v;
return sum;
}
}
export function run(step: number, times: number): number {
const c = new Counter(step);
for (let i = 0; i < times; i++) c.bump();
return c.scaled(2);
}
export function accumulate(xs: readonly number[]): number {
const a = new Accumulator();
for (const x of xs) a.push(x);
return a.total();
}
export function direct(seed: number): number {
const c = new Counter(seed);
c.count = 10;
c.count += seed;
return c.count;
}
`,
calls: [
{ fn: "run", args: [f(2.5), i(3)] },
{ fn: "run", args: [i(4), i(0)] },
{ fn: "accumulate", args: [{ t: "nums", v: [1.25, -2, "-0"] }] },
{ fn: "accumulate", args: [{ t: "nums", v: [] }] },
{ fn: "direct", args: [f(0.5)] },
{ fn: "direct", args: [i(7)] },
],
},
{
name: "exceptions: parser throw/catch/narrow chain matches node byte for byte",
src: `
export type ParseError =
| { readonly kind: "bad_digit"; readonly at: number }
| { readonly kind: "empty" };
function parseDigits(bytes: Uint8Array): number {
if (bytes.length === 0) throw { kind: "empty" } as ParseError;
let n = 0;
for (let i = 0; i < bytes.length; i++) {
const b = bytes[i];
if (b < 48 || b > 57) throw { kind: "bad_digit", at: i } as ParseError;
n = n * 10 + (b - 48);
}
return n;
}
export function safeParse(bytes: Uint8Array): number {
try {
return parseDigits(bytes);
} catch (e) {
const err = e as ParseError;
if (err.kind === "bad_digit") return -err.at - 1;
return -1000;
}
}
`,
calls: [
{ fn: "safeParse", args: [{ t: "bytes", v: [49, 50, 51] }] },
{ fn: "safeParse", args: [{ t: "bytes", v: [49, 65, 51] }] },
{ fn: "safeParse", args: [{ t: "bytes", v: [65] }] },
{ fn: "safeParse", args: [{ t: "bytes", v: [] }] },
],
},
{
name: "exceptions: a throw inside a map callback unwinds out of the lowered loop",
src: `
export type Bad = { readonly kind: "bad"; readonly at: number } | { readonly kind: "none" };
export function firstBad(xs: readonly number[]): number {
try {
const doubled = xs.map((x, i) => {
if (x < 0) throw { kind: "bad", at: i } as Bad;
return x * 2;
});
return doubled.length;
} catch (e) {
const err = e as Bad;
return err.kind === "bad" ? -err.at - 1 : -99;
}
}
`,
calls: [
{ fn: "firstBad", args: [{ t: "nums", v: [1, 2, -3, 4] }] },
{ fn: "firstBad", args: [{ t: "nums", v: [-1] }] },
{ fn: "firstBad", args: [{ t: "nums", v: [1, 2] }] },
{ fn: "firstBad", args: [{ t: "nums", v: [] }] },
],
},
{
name: "exceptions: rethrow, nested try, and finally ordering match node",
src: `
export type Fail = { readonly kind: "inner"; readonly n: number } | { readonly kind: "outer"; readonly n: number };
export function f(x: number): number {
let log = 0;
try {
try {
if (x > 0) throw { kind: "inner", n: x } as Fail;
log += 1;
} catch (e) {
const err = e as Fail;
if (err.kind === "inner") {
if (err.n > 5) throw { kind: "outer", n: err.n } as Fail;
}
throw e;
} finally {
log += 10;
}
} catch (e) {
const err = e as Fail;
const tag = err.kind === "outer" ? 2 : 1;
return log * 100 + tag;
}
return log;
}
`,
calls: [
{ fn: "f", args: [f(3)] },
{ fn: "f", args: [f(9)] },
{ fn: "f", args: [f(-1)] },
{ fn: "f", args: [f(0.5)] },
],
},
{
name: "exceptions: try/finally interleaves with loop break and continue like node",
src: `
export type Never2 = { readonly kind: "never" } | { readonly kind: "either" };
export function loopLog(n: number): number {
let log = 0;
for (let i = 0; i < n; i++) {
try {
if (i === 1) continue;
if (i === 3) break;
log = log * 10 + 1;
} finally {
log = log * 10 + 2;
}
}
return log;
}
export function sumUntilNeg(xs: readonly number[]): number {
let sum = 0;
try {
for (const x of xs) {
if (x < 0) throw { kind: "never" } as Never2;
sum += x;
}
return sum;
} catch {
return -sum;
}
}
`,
calls: [
{ fn: "loopLog", args: [i(0)] },
{ fn: "loopLog", args: [i(1)] },
{ fn: "loopLog", args: [i(2)] },
{ fn: "loopLog", args: [i(6)] },
{ fn: "sumUntilNeg", args: [{ t: "nums", v: [1, 2.5, -1, 4] }] },
{ fn: "sumUntilNeg", args: [{ t: "nums", v: [1, 2] }] },
],
},
{
name: "exceptions: a throw mid-mutation keeps the owned array's prior state (node parity)",
src: `
export type Halt = { readonly kind: "halt" } | { readonly kind: "never" };
export function f(stop: number): number {
const xs: number[] = [];
try {
xs.push(1);
xs.push(2);
if (xs.length >= stop) throw { kind: "halt" } as Halt;
xs.push(3);
} catch {
return xs.length;
}
return xs.length * 10;
}
`,
calls: [
{ fn: "f", args: [i(2)] },
{ fn: "f", args: [i(1)] },
{ fn: "f", args: [i(5)] },
],
},
{
name: "exceptions: class constructors and methods throw like node",
src: `
export type Range2 = { readonly kind: "range"; readonly v: number } | { readonly kind: "none" };
export class Gauge {
v: number;
constructor(v: number) {
if (v < 0) throw { kind: "range", v } as Range2;
this.v = v;
}
add(d: number): void {
if (this.v + d > 100) throw { kind: "range", v: this.v + d } as Range2;
this.v += d;
}
}
export function run(start: number, d: number): number {
try {
const g = new Gauge(start);
g.add(d);
return g.v;
} catch (e) {
const err = e as Range2;
return err.kind === "range" ? -err.v : -1;
}
}
`,
calls: [
{ fn: "run", args: [f(10), f(5.5)] },
{ fn: "run", args: [f(-2), f(0)] },
{ fn: "run", args: [f(60), f(50)] },
],
},
{
name: "exceptions: number-shaped throws ride the f64 payload slot",
src: `
export function g(x: number): number {
try {
if (x > 5) throw x * 2;
return x;
} catch (e) {
const n = e as number;
return n + 0.5;
}
}
`,
calls: [
{ fn: "g", args: [f(1.5)] },
{ fn: "g", args: [f(6)] },
{ fn: "g", args: [f(7.25)] },
],
},
{
name: "exceptions: switch-case throws, try inside callbacks, labeled-loop throws",
src: `
export type E = { readonly kind: "bad" } | { readonly kind: "stop" };
export function viaSwitch(n: number): number {
try {
switch (n) {
case 1: throw { kind: "bad" } as E;
case 2: return 20;
default: return 0;
}
} catch { return -1; }
}
function classify(x: number): number {
if (x < 0) throw { kind: "bad" } as E;
return x * 2;
}
export function mapWithLocalCatch(xs: readonly number[]): readonly number[] {
return xs.map((x) => {
try {
return classify(x);
} catch {
return -1;
}
});
}
export function labeled(n: number): number {
let acc = 0;
try {
outer: for (let i = 0; i < n; i++) {
for (let j = 0; j < 3; j++) {
if (i + j === 4) throw { kind: "stop" } as E;
if (j === 2) continue outer;
acc += 1;
}
}
return acc;
} catch {
return -acc;
}
}
`,
calls: [
{ fn: "viaSwitch", args: [i(1)] },
{ fn: "viaSwitch", args: [i(2)] },
{ fn: "viaSwitch", args: [i(9)] },
{ fn: "mapWithLocalCatch", args: [{ t: "nums", v: [1, -2, 3.5] }] },
{ fn: "mapWithLocalCatch", args: [{ t: "nums", v: [] }] },
{ fn: "labeled", args: [i(2)] },
{ fn: "labeled", args: [i(6)] },
{ fn: "labeled", args: [i(0)] },
],
},
{
name: "export lists and value re-exports: renamed bindings and a re-export chain agree with node",
src: `
import { bump } from "./api.ts";
function tripled(n: number): number { return n * 3; }
export { tripled as thrice };
export { bump } from "./api.ts";
export { OFFSET as BASE } from "./api.ts";
export function combined(n: number): number { return bump(n) + tripled(n); }
`,
files: {
"api.ts": `
export { bump, OFFSET } from "./impl.ts";
`,
"impl.ts": `
export const OFFSET = 40;
export function bump(n: number): number { return n + OFFSET; }
`,
},
calls: [
{ fn: "combined", args: [i(5)] },
{ fn: "combined", args: [i(-3)] },
{ fn: "thrice", args: [i(7)] },
{ fn: "bump", args: [i(2)] },
],
},
{
name: "heterogeneous throws: the thrown union narrows by kind in the catch, chains and callbacks included",
src: `
export interface ParseError { readonly kind: "parse"; readonly at: number; }
export interface IoError { readonly kind: "io"; readonly code: number; readonly hard: boolean; }
export type Low = { readonly kind: "under"; readonly by: number } | { readonly kind: "zero" };
function inner(n: number): number {
if (n < 0) throw { kind: "parse", at: n } as ParseError;
if (n > 100) throw { kind: "io", code: n, hard: n > 1000 } as IoError;
return n * 2;
}
function middle(n: number): number {
// A throw two frames down unwinds through this one untouched.
return inner(n) + 1;
}
export function catches(n: number): number {
try {
return middle(n);
} catch (e) {
if (e.kind === "parse") return e.at - 1000;
if (e.kind === "io") return e.hard ? -e.code : e.code;
return -1;
}
}
export function viaSwitchAndUnion(n: number): number {
try {
if (n < 0) { const low: Low = n === -1 ? { kind: "zero" } : { kind: "under", by: n }; throw low; }
return inner(n);
} catch (e) {
switch (e.kind) {
case "under": return e.by - 100;
case "zero": return -7;
case "io": return e.code + 5;
default: return -2;
}
}
}
export function callbackThrows(xs: readonly number[]): number {
try {
const doubled = xs.map((x) => {
if (x < 0) throw { kind: "parse", at: x } as ParseError;
if (x > 100) throw { kind: "io", code: x, hard: false } as IoError;
return x * 2;
});
return doubled.length;
} catch (e) {
if (e.kind === "parse") return e.at;
if (e.kind === "io") return e.code + 900;
return -3;
}
}
export function narrowedInCallback(xs: readonly number[], n: number): number {
try {
return inner(n);
} catch (e) {
if (e.kind === "io") {
// The narrowed arm's payload read inside an inline callback.
return xs.filter((x) => x > e.code).length;
}
return -4;
}
}
export function rethrowNarrowed(n: number): number {
try {
try {
return inner(n);
} catch (e) {
if (e.kind === "io") throw e; // rethrow of a narrowed arm re-raises the bound value
return -5;
}
} catch (e2) {
if (e2.kind === "io") return e2.hard ? e2.code + 7000 : e2.code + 70;
return -9;
}
}
`,
calls: [
{ fn: "catches", args: [i(4)] },
{ fn: "catches", args: [i(-6)] },
{ fn: "catches", args: [i(300)] },
{ fn: "catches", args: [i(3000)] },
{ fn: "viaSwitchAndUnion", args: [i(5)] },
{ fn: "viaSwitchAndUnion", args: [i(-1)] },
{ fn: "viaSwitchAndUnion", args: [i(-8)] },
{ fn: "viaSwitchAndUnion", args: [i(200)] },
{ fn: "callbackThrows", args: [{ t: "nums", v: [1, 2, 3] }] },
{ fn: "callbackThrows", args: [{ t: "nums", v: [1, -4, 3] }] },
{ fn: "callbackThrows", args: [{ t: "nums", v: [1, 400, -2] }] },
{ fn: "narrowedInCallback", args: [{ t: "nums", v: [50, 150, 250] }, i(120)] },
{ fn: "narrowedInCallback", args: [{ t: "nums", v: [50, 150, 250] }, i(7)] },
{ fn: "rethrowNarrowed", args: [i(6)] },
{ fn: "rethrowNarrowed", args: [i(-2)] },
{ fn: "rethrowNarrowed", args: [i(500)] },
{ fn: "rethrowNarrowed", args: [i(5000)] },
],
},
{
name: "class statics: static methods and consts behave identically under node and native",
src: `
export class Gauge {
reading: number;
static readonly CEILING = 100;
static readonly FLOOR = -10;
constructor(reading: number) { this.reading = reading; }
static clamp(v: number): number {
if (v > Gauge.CEILING) return Gauge.CEILING;
if (v < Gauge.FLOOR) return Gauge.FLOOR;
return v;
}
static span(): number { return Gauge.CEILING - Gauge.FLOOR; }
private normalized(): number { return Gauge.clamp(this.reading); }
read(): number { return this.normalized(); }
}
export function measure(v: number): number {
const g = new Gauge(v);
return g.read() + Gauge.span();
}
export function clamped(v: number): number {
return Gauge.clamp(v);
}
`,
calls: [
{ fn: "measure", args: [i(50)] },
{ fn: "measure", args: [i(500)] },
{ fn: "measure", args: [i(-50)] },
{ fn: "clamped", args: [f(99.5)] },
{ fn: "clamped", args: [f("nan")] },
],
},
{
name: "mutation loosenings: append writes, reassigned owning bindings, and readonly borrows match node",
src: `
function total(xs: readonly number[]): number {
let t = 0;
for (const x of xs) { t += x; }
return t;
}
function spread(xs: readonly number[]): number {
// A borrowed slice read through nested borrowing calls.
return total(xs) - xs.length;
}
export function appends(xs: readonly number[]): readonly number[] {
const out: number[] = [];
for (const x of xs) {
if (x >= 0) out[out.length] = x * 2;
else out.push(-x);
}
out[out.length] = total(out);
return out;
}
export function rebuilt(xs: readonly number[], flip: boolean): readonly number[] {
let w = xs.slice();
w.push(100);
if (flip) {
w = xs.filter((x) => x > 0);
w.push(200);
}
w.sort((a, b) => a - b);
return w;
}
export function resetToEmpty(n: number): number {
let acc: number[] = [n, n + 1];
acc.push(n + 2);
acc = [];
acc.push(n * 10);
return acc.length * 1000 + acc[0];
}
export function borrowed(n: number): number {
const out: number[] = [n];
const before = spread(out);
out.push(n + 1);
out[out.length] = n + 2;
const mid = total(out);
out.push(n + 3);
return before + mid + total(out);
}
`,
calls: [
{ fn: "appends", args: [{ t: "nums", v: [1, -2, 3] }] },
{ fn: "appends", args: [{ t: "nums", v: [] }] },
{ fn: "rebuilt", args: [{ t: "nums", v: [3, -1, 2] }, { t: "b", v: true }] },
{ fn: "rebuilt", args: [{ t: "nums", v: [3, -1, 2] }, { t: "b", v: false }] },
{ fn: "resetToEmpty", args: [i(4)] },
{ fn: "borrowed", args: [i(5)] },
{ fn: "borrowed", args: [i(-7)] },
],
},
{
name: "byte text: simple case mapping is byte-identical (ASCII, Greek, Cyrillic, growth, invalid passthrough)",
src: `
export function up(s: Uint8Array): Uint8Array { return s.toUpperCase(); }
export function low(s: Uint8Array): Uint8Array { return s.toLowerCase(); }
export function roundTrip(s: Uint8Array): Uint8Array { return s.toUpperCase().toLowerCase(); }
`,
calls: [
{ fn: "up", args: [{ t: "bytes", v: [104, 101, 108, 108, 111, 33] }] }, // "hello!"
{ fn: "up", args: [{ t: "bytes", v: [207, 131, 206, 175, 207, 131, 207, 133, 207, 134, 206, 191, 207, 130] }] }, // σίσυφος (final sigma)
{ fn: "low", args: [{ t: "bytes", v: [208, 159, 208, 160, 208, 152, 208, 146, 208, 149, 208, 162] }] }, // ПРИВЕТ
{ fn: "up", args: [{ t: "bytes", v: [115, 116, 114, 97, 195, 159, 101] }] }, // straße: ß has NO simple upper — stays ß
{ fn: "up", args: [{ t: "bytes", v: [197, 191] }] }, // ſ -> S (2 bytes -> 1)
{ fn: "up", args: [{ t: "bytes", v: [194, 181] }] }, // µ -> Μ (2 -> 2)
{ fn: "up", args: [{ t: "bytes", v: [200, 191] }] }, // ȿ U+023F -> U+2C7E (2 -> 3, growth)
{ fn: "up", args: [{ t: "bytes", v: [240, 144, 144, 168] }] }, // Deseret U+10428 -> U+10400 (4 -> 4)
{ fn: "up", args: [{ t: "bytes", v: [97, 255, 195] }] }, // invalid lead + truncated tail pass through
{ fn: "low", args: [{ t: "bytes", v: [224, 128, 97, 128, 65] }] }, // overlong lead, lone continuation
{ fn: "up", args: [{ t: "bytes", v: [237, 160, 128, 66] }] }, // surrogate encoding is invalid: passthrough
{ fn: "up", args: [{ t: "bytes", v: [] }] },
{ fn: "roundTrip", args: [{ t: "bytes", v: [206, 163, 206, 145, 206, 155] }] }, // ΣΑΛ -> σαλ (Σ lowers to σ, never final ς)
],
},
{
name: "byte text: repeat edges and byte-honest padding (multi-byte fill truncates by bytes)",
src: `
import { asciiBytes } from "@native-sdk/core";
export function rep(s: Uint8Array, n: number): Uint8Array { return s.repeat(n); }
export function padDefault(s: Uint8Array, n: number): Uint8Array { return s.padStart(n); }
export function padCustom(s: Uint8Array, n: number, fill: Uint8Array): Uint8Array { return s.padStart(n, fill); }
export function padEndCustom(s: Uint8Array, n: number, fill: Uint8Array): Uint8Array { return s.padEnd(n, fill); }
export function gauge(used: number): Uint8Array { return asciiBytes("#").repeat(used).padEnd(8, asciiBytes(".")); }
`,
calls: [
{ fn: "rep", args: [{ t: "bytes", v: [97, 98] }, i(3)] },
{ fn: "rep", args: [{ t: "bytes", v: [97, 98] }, i(0)] },
{ fn: "rep", args: [{ t: "bytes", v: [] }, i(5)] },
{ fn: "rep", args: [{ t: "bytes", v: [195, 169] }, i(2)] }, // multi-byte é
{ fn: "padDefault", args: [{ t: "bytes", v: [97, 98] }, i(5)] },
{ fn: "padDefault", args: [{ t: "bytes", v: [97, 98] }, i(1)] }, // at/under target: unchanged
{ fn: "padDefault", args: [{ t: "bytes", v: [97, 98] }, i(-3)] }, // negative target: unchanged
{ fn: "padCustom", args: [{ t: "bytes", v: [97, 98] }, i(8), { t: "bytes", v: [120, 121] }] }, // xy fill truncates
{ fn: "padCustom", args: [{ t: "bytes", v: [97] }, i(4), { t: "bytes", v: [195, 169] }] }, // é fill cut MID-SEQUENCE at byte 3: byte-honest, identical both sides
{ fn: "padCustom", args: [{ t: "bytes", v: [97, 98] }, i(9), { t: "bytes", v: [] }] }, // empty fill: unchanged
{ fn: "padEndCustom", args: [{ t: "bytes", v: [97, 98] }, i(7), { t: "bytes", v: [46] }] },
{ fn: "padDefault", args: [{ t: "bytes", v: [195, 169] }, i(4)] }, // é is 2 BYTES: 2 pad bytes, not 3
{ fn: "gauge", args: [i(3)] },
],
},
{
name: "byte text: search dispatches by argument type (bytes substring vs byte element)",
src: `
export function starts(s: Uint8Array, t: Uint8Array): boolean { return s.startsWith(t); }
export function ends(s: Uint8Array, t: Uint8Array): boolean { return s.endsWith(t); }
export function hasSub(s: Uint8Array, t: Uint8Array): boolean { return s.includes(t); }
export function hasByte(s: Uint8Array, b: number): boolean { return s.includes(b); }
export function idxSub(s: Uint8Array, t: Uint8Array): number { return s.indexOf(t); }
export function idxByte(s: Uint8Array, b: number): number { return s.indexOf(b); }
export function lastSub(s: Uint8Array, t: Uint8Array): number { return s.lastIndexOf(t); }
export function lastByte(s: Uint8Array, b: number): number { return s.lastIndexOf(b); }
`,
calls: [
{ fn: "starts", args: [{ t: "bytes", v: [97, 98, 99] }, { t: "bytes", v: [97, 98] }] },
{ fn: "starts", args: [{ t: "bytes", v: [97, 98, 99] }, { t: "bytes", v: [] }] }, // empty needle: true
{ fn: "starts", args: [{ t: "bytes", v: [97] }, { t: "bytes", v: [97, 98] }] }, // needle longer than hay
{ fn: "ends", args: [{ t: "bytes", v: [97, 98, 99] }, { t: "bytes", v: [98, 99] }] },
{ fn: "ends", args: [{ t: "bytes", v: [97, 98, 99] }, { t: "bytes", v: [] }] },
{ fn: "hasSub", args: [{ t: "bytes", v: [97, 88, 98, 88] }, { t: "bytes", v: [88, 98] }] },
{ fn: "hasSub", args: [{ t: "bytes", v: [97, 98] }, { t: "bytes", v: [99] }] },
{ fn: "hasByte", args: [{ t: "bytes", v: [65, 66, 67] }, i(66)] },
{ fn: "hasByte", args: [{ t: "bytes", v: [65, 66, 67] }, f(66.5)] }, // SameValueZero: no byte is 66.5
{ fn: "hasByte", args: [{ t: "bytes", v: [0, 1] }, f("-0")] }, // -0 matches 0
{ fn: "hasByte", args: [{ t: "bytes", v: [65] }, f("nan")] }, // NaN matches nothing
{ fn: "hasByte", args: [{ t: "bytes", v: [65] }, i(300)] }, // out of byte range
{ fn: "idxSub", args: [{ t: "bytes", v: [97, 88, 98, 88] }, { t: "bytes", v: [88] }] },
{ fn: "idxSub", args: [{ t: "bytes", v: [97, 98, 99] }, { t: "bytes", v: [] }] }, // empty: 0
{ fn: "idxSub", args: [{ t: "bytes", v: [97] }, { t: "bytes", v: [98] }] }, // missing: -1
{ fn: "idxByte", args: [{ t: "bytes", v: [65, 66, 67, 66] }, i(66)] },
{ fn: "lastSub", args: [{ t: "bytes", v: [97, 97, 97, 97] }, { t: "bytes", v: [97, 97] }] }, // overlap: 2
{ fn: "lastSub", args: [{ t: "bytes", v: [97, 98, 99] }, { t: "bytes", v: [] }] }, // empty: hay.length
{ fn: "lastByte", args: [{ t: "bytes", v: [65, 66, 67, 66] }, i(66)] },
{ fn: "lastByte", args: [{ t: "bytes", v: [65] }, i(90)] },
],
},
{
name: "byte text: the trim family strips the JS whitespace set over UTF-8, views only",
src: `
import { trimAsciiSpaces } from "@native-sdk/core/text";
export function t(s: Uint8Array): Uint8Array { return s.trim(); }
export function ts(s: Uint8Array): Uint8Array { return s.trimStart(); }
export function te(s: Uint8Array): Uint8Array { return s.trimEnd(); }
export function sdkDiff(s: Uint8Array): number {
// Reconciliation pin: .trim() strips the JS set (\\n included); the SDK's
// trimAsciiSpaces stays byte-exact ASCII (space/tab/CR, never LF).
return s.trim().length * 100 + trimAsciiSpaces(s).length;
}
`,
calls: [
{ fn: "t", args: [{ t: "bytes", v: [194, 160, 9, 32, 97, 32, 98, 32, 10, 227, 128, 128] }] }, // NBSP \t sp "a b" sp \n IDEOGRAPHIC SPACE
{ fn: "ts", args: [{ t: "bytes", v: [239, 187, 191, 97] }] }, // U+FEFF is JS whitespace
{ fn: "te", args: [{ t: "bytes", v: [97, 13, 10] }] },
{ fn: "t", args: [{ t: "bytes", v: [255, 32, 97, 32, 255] }] }, // invalid bytes stop the trim
{ fn: "t", args: [{ t: "bytes", v: [32, 32, 32] }] }, // all whitespace -> empty
{ fn: "t", args: [{ t: "bytes", v: [] }] },
{ fn: "sdkDiff", args: [{ t: "bytes", v: [32, 97, 10, 32] }] }, // " a\\n " -> trim 1, trimAsciiSpaces 2 ("a\\n")
],
},
{
name: "byte text: split shapes, multi-byte separators, ownership of the parts array, and at()",
src: `
import { asciiBytes } from "@native-sdk/core";
export function parts(s: Uint8Array, sep: Uint8Array): number { return s.split(sep).length; }
export function part(s: Uint8Array, sep: Uint8Array, i: number): Uint8Array {
const xs = s.split(sep);
return xs[i];
}
export function grown(s: Uint8Array): number {
const xs = s.split(asciiBytes(","));
xs.push(asciiBytes("tail"));
let total = 0;
for (const p of xs) total += p.length;
return total * 10 + xs.length;
}
export function at(s: Uint8Array, i: number): number { return s.at(i) ?? -1; }
export function atMiss(s: Uint8Array, i: number): boolean { return s.at(i) === undefined; }
`,
calls: [
{ fn: "parts", args: [{ t: "bytes", v: [88, 97, 88, 98, 88] }, { t: "bytes", v: [88] }] }, // "XaXbX" -> 4
{ fn: "parts", args: [{ t: "bytes", v: [97, 88, 88, 98] }, { t: "bytes", v: [88] }] }, // adjacent -> 3
{ fn: "parts", args: [{ t: "bytes", v: [97, 98] }, { t: "bytes", v: [90] }] }, // no match -> 1
{ fn: "parts", args: [{ t: "bytes", v: [] }, { t: "bytes", v: [88] }] }, // "" -> [""]
{ fn: "parts", args: [{ t: "bytes", v: [97, 97, 97, 97] }, { t: "bytes", v: [97, 97] }] }, // non-overlapping -> 3
{ fn: "part", args: [{ t: "bytes", v: [88, 97, 88, 98, 88] }, { t: "bytes", v: [88] }, i(0)] },
{ fn: "part", args: [{ t: "bytes", v: [88, 97, 88, 98, 88] }, { t: "bytes", v: [88] }, i(1)] },
{ fn: "part", args: [{ t: "bytes", v: [88, 97, 88, 98, 88] }, { t: "bytes", v: [88] }, i(3)] },
{ fn: "part", args: [{ t: "bytes", v: [97, 195, 169, 98] }, { t: "bytes", v: [195, 169] }, i(1)] }, // multi-byte separator
{ fn: "grown", args: [{ t: "bytes", v: [97, 44, 98, 98] }] },
{ fn: "at", args: [{ t: "bytes", v: [65, 66, 67] }, i(0)] },
{ fn: "at", args: [{ t: "bytes", v: [65, 66, 67] }, i(-1)] },
{ fn: "at", args: [{ t: "bytes", v: [65, 66, 67] }, i(-4)] }, // out of range from the end
{ fn: "at", args: [{ t: "bytes", v: [65, 66, 67] }, i(3)] },
{ fn: "atMiss", args: [{ t: "bytes", v: [65] }, i(2)] },
{ fn: "atMiss", args: [{ t: "bytes", v: [65] }, i(0)] },
],
},
];
// ------------------------------------------------------------ arg spelling
function numToZig(v: number): string {
if (Object.is(v, -0)) return "-0.0";
const s = String(v);
return /[.eE]/.test(s) ? s : `${s}.0`;
}
function zigArg(a: Arg): string {
switch (a.t) {
case "i":
return String(a.v);
case "f":
if (a.v === "nan") return "std.math.nan(f64)";
if (a.v === "inf") return "std.math.inf(f64)";
if (a.v === "-inf") return "-std.math.inf(f64)";
if (a.v === "-0") return "-0.0";
return numToZig(a.v);
case "b":
return a.v ? "true" : "false";
case "null":
return "null";
case "bytes":
return `&[_]u8{${a.v.join(", ")}}`;
case "nums":
return `&[_]f64{${a.v.map(numElemToZig).join(", ")}}`;
case "tag":
return `.${a.v}`;
case "str":
return JSON.stringify(a.v);
}
}
function numElemToZig(v: number | "nan" | "-0"): string {
if (v === "nan") return "std.math.nan(f64)";
if (v === "-0") return "-0.0";
return numToZig(v);
}
function nodeArg(a: Arg): string {
switch (a.t) {
case "i":
return String(a.v);
case "f":
if (a.v === "nan") return "NaN";
if (a.v === "inf") return "Infinity";
if (a.v === "-inf") return "-Infinity";
if (a.v === "-0") return "-0";
return String(a.v);
case "b":
return a.v ? "true" : "false";
case "null":
return "null";
case "bytes":
return `Uint8Array.from([${a.v.join(", ")}])`;
case "nums":
return `[${a.v.map((v) => (v === "nan" ? "NaN" : String(v))).join(", ")}]`;
case "tag":
return JSON.stringify(a.v);
case "str":
return JSON.stringify(a.v);
}
}
// --------------------------------------------------------- driver assembly
function caseId(idx: number): string {
return `case_${String(idx).padStart(2, "0")}`;
}
function nodeDriver(cases: readonly RunCase[]): string {
const lines: string[] = [
"// Generated run-fidelity driver, plain-TS side: import each case module",
"// as-is and print the canonical transcript to stdout.",
"// The byte-text methods install before any call runs — the same tables",
"// rt.zig case-maps from, so the two transcripts must match bytewise.",
'import { installTextMethods } from "./text_polyfill.ts";',
];
cases.forEach((c, idx) =>
lines.push(`import * as ${caseId(idx)} from "./${c.files ? `${caseId(idx)}/core.ts` : `${caseId(idx)}.ts`}";`),
);
lines.push(
"",
"installTextMethods();",
"const out = [];",
"function hex(bytes) {",
' let s = "";',
' for (const b of bytes) s += b.toString(16).padStart(2, "0");',
" return s;",
"}",
"function fmt(v) {",
' if (v === null) return "null";',
' if (typeof v === "boolean") return v ? "b:true" : "b:false";',
' if (typeof v === "number") {',
' if (Number.isNaN(v)) return "n:nan";',
" const dv = new DataView(new ArrayBuffer(8));",
" dv.setFloat64(0, v);",
' let s = "n:";',
' for (let idx = 0; idx < 8; idx++) s += dv.getUint8(idx).toString(16).padStart(2, "0");',
" return s;",
" }",
' if (typeof v === "string") return "x:" + hex(new TextEncoder().encode(v));',
' if (v instanceof Uint8Array) return "x:" + hex(v);',
' if (Array.isArray(v)) return "[" + v.map(fmt).join(",") + "]";',
' throw new Error("unsupported value in the run-fidelity transcript");',
"}",
"",
);
cases.forEach((c, idx) => {
const id = caseId(idx);
for (const [ci, call] of (c.calls ?? []).entries()) {
lines.push(`out.push("${id}.${ci} " + fmt(${id}.${call.fn}(${call.args.map(nodeArg).join(", ")})));`);
}
if (c.node) {
lines.push(`{`);
lines.push(` const mod = ${id};`);
lines.push(` const line = (tag, v) => out.push("${id}." + tag + " " + fmt(v));`);
lines.push(c.node.trim());
lines.push(`}`);
}
});
lines.push("", 'process.stdout.write(out.join("\\n") + "\\n");', "");
return lines.join("\n");
}
function zigDriver(cases: readonly RunCase[]): string {
const lines: string[] = [
"//! Generated run-fidelity driver, native side: run every case's emitted",
"//! module and write the canonical transcript; the plain-TS driver must",
"//! produce identical bytes.",
"",
'const std = @import("std");',
];
cases.forEach((_, idx) => lines.push(`const ${caseId(idx)} = @import("${caseId(idx)}.zig");`));
lines.push(
"",
"var sink: std.ArrayList(u8) = .empty;",
"var gpa: std.mem.Allocator = undefined;",
"",
"fn put(s: []const u8) void {",
' sink.appendSlice(gpa, s) catch @panic("oom");',
"}",
"",
"fn putHexByte(b: u8) void {",
' const digits = "0123456789abcdef";',
' sink.append(gpa, digits[b >> 4]) catch @panic("oom");',
' sink.append(gpa, digits[b & 0xf]) catch @panic("oom");',
"}",
"",
"// Numbers travel as f64 bit patterns (any NaN canonicalizes to n:nan),",
"// so the transcript never depends on float-to-text formatting.",
"fn putNum(x: f64) void {",
" if (std.math.isNan(x)) {",
' put("n:nan");',
" return;",
" }",
' put("n:");',
" const bits: u64 = @bitCast(x);",
" var idx: usize = 0;",
" while (idx < 8) : (idx += 1) {",
" putHexByte(@truncate(bits >> @intCast((7 - idx) * 8)));",
" }",
"}",
"",
"fn putValue(v: anytype) void {",
" const T = @TypeOf(v);",
" switch (@typeInfo(T)) {",
' .bool => put(if (v) "b:true" else "b:false"),',
" .int, .comptime_int => putNum(@floatFromInt(v)),",
" .float, .comptime_float => putNum(v),",
' .optional => if (v) |inner| putValue(inner) else put("null"),',
' .@"enum" => {',
' put("x:");',
" for (@tagName(v)) |b| putHexByte(b);",
" },",
" .pointer => |p| {",
" if (p.size == .slice and p.child == u8) {",
' put("x:");',
" for (v) |b| putHexByte(b);",
" } else if (p.size == .slice) {",
' put("[");',
" for (v, 0..) |elem, idx| {",
' if (idx > 0) put(",");',
" putValue(elem);",
" }",
' put("]");',
" } else {",
' @compileError("unsupported pointer value in the transcript");',
" }",
" },",
' else => @compileError("unsupported value type in the transcript"),',
" }",
"}",
"",
"fn tagged(tag: []const u8, v: anytype) void {",
" put(tag);",
' put(" ");',
" putValue(v);",
' put("\\n");',
"}",
"",
"pub fn main(init: std.process.Init) !void {",
" gpa = init.arena.allocator();",
);
cases.forEach((c, idx) => {
const id = caseId(idx);
for (const [ci, call] of (c.calls ?? []).entries()) {
lines.push(` tagged("${id}.${ci}", ${id}.${call.fn}(${call.args.map(zigArg).join(", ")}));`);
}
if (c.zig) {
lines.push(` {`);
lines.push(` const m = ${id};`);
lines.push(` const Row = struct {`);
lines.push(` fn emit(tag: []const u8, v: anytype) void {`);
lines.push(` put("${id}.");`);
lines.push(` tagged(tag, v);`);
lines.push(` }`);
lines.push(` };`);
lines.push(` const row = Row.emit;`);
lines.push(c.zig.replace(/^\n+|\n+$/g, "").replace(/^ {4}/gm, " "));
lines.push(` }`);
}
});
lines.push(
' try std.Io.Dir.cwd().writeFile(init.io, .{ .sub_path = "zig_transcript.txt", .data = sink.items });',
"}",
"",
);
return lines.join("\n");
}
// ------------------------------------------------------------------- tests
test("run corpus: every case transpiles clean", () => {
for (const c of runCorpus) {
const result = c.files
? transpileFiles({ "core.ts": c.src, ...c.files }, c.options ?? {})
: transpile(c.src, c.options ?? {});
assert.equal(result.typeErrors.length, 0, `${c.name}: tsc errors\n${result.typeErrors.join("\n")}`);
const details = result.diagnostics.map((d) => `${d.id} ${d.message}`).join("\n");
assert.equal(result.ok, true, `${c.name}: transpile failed\n${details}`);
}
});
test("run corpus: emitted Zig behaves byte-identically to the same source under node", { skip: !hasZig, timeout: 600_000 }, () => {
const work = fs.mkdtempSync(path.join(os.tmpdir(), "native-core-runfidelity-"));
try {
// Native side: emitted modules + rt kernel + generated driver.
fs.copyFileSync(path.join(pkg, "rt", "rt.zig"), path.join(work, "rt.zig"));
runCorpus.forEach((c, idx) => {
const result = c.files
? transpileFiles({ "core.ts": c.src, ...c.files }, c.options ?? {})
: transpile(c.src, c.options ?? {});
assert.equal(result.ok, true, `${c.name}: transpile failed before the run step`);
fs.writeFileSync(path.join(work, `${caseId(idx)}.zig`), result.zig!);
});
fs.writeFileSync(path.join(work, "driver.zig"), zigDriver(runCorpus));
// Plain-TS side: the same sources verbatim, with only the SDK import
// specifier resolved to a file path (a resolution detail, not semantics).
const sdkCopy = path.join(work, "sdk_core.ts");
fs.copyFileSync(path.join(pkg, "sdk", "core.ts"), sdkCopy);
fs.copyFileSync(path.join(pkg, "sdk", "text.ts"), path.join(work, "sdk_text.ts"));
// The byte-text polyfill and its generated tables — the node half of
// the text-method surface the zig half gets from rt.zig.
fs.copyFileSync(path.join(pkg, "src", "text_polyfill.ts"), path.join(work, "text_polyfill.ts"));
fs.copyFileSync(path.join(pkg, "src", "text_tables.ts"), path.join(work, "text_tables.ts"));
const resolveSdk = (src: string, prefix: string): string =>
src
.replace(/"@native-sdk\/core\/text"/g, `"${prefix}sdk_text.ts"`)
.replace(/"@native-sdk\/core"/g, `"${prefix}sdk_core.ts"`);
runCorpus.forEach((c, idx) => {
if (c.files) {
// Multi-file case: its own directory, so relative imports between
// the modules keep their spellings (only SDK specifiers resolve).
const dir = path.join(work, caseId(idx));
fs.mkdirSync(dir, { recursive: true });
for (const [name, source] of Object.entries({ "core.ts": c.src, ...c.files })) {
fs.mkdirSync(path.dirname(path.join(dir, name)), { recursive: true });
fs.writeFileSync(path.join(dir, name), resolveSdk(source, "../"));
}
return;
}
fs.writeFileSync(path.join(work, `${caseId(idx)}.ts`), resolveSdk(c.src, "./"));
});
fs.writeFileSync(path.join(work, "driver.ts"), nodeDriver(runCorpus));
let nodeOut: string;
try {
nodeOut = execFileSync(process.execPath, [path.join(work, "driver.ts")], {
cwd: work,
encoding: "utf8",
});
} catch (e) {
const err = e as { stderr?: string; stdout?: string };
assert.fail(`plain-TS driver failed:\n${err.stderr ?? ""}${err.stdout ?? ""}`);
}
try {
execFileSync("zig", ["run", "driver.zig"], { cwd: work, encoding: "utf8", stdio: "pipe" });
} catch (e) {
const err = e as { stderr?: string; stdout?: string };
assert.fail(`native driver failed:\n${err.stderr ?? ""}${err.stdout ?? ""}`);
}
const zigOut = fs.readFileSync(path.join(work, "zig_transcript.txt"), "utf8");
if (nodeOut !== zigOut) {
const nodeLines = nodeOut.split("\n");
const zigLines = zigOut.split("\n");
const diffs: string[] = [];
const max = Math.max(nodeLines.length, zigLines.length);
for (let idx = 0; idx < max; idx++) {
if (nodeLines[idx] !== zigLines[idx]) {
diffs.push(` ts: ${nodeLines[idx] ?? "<missing>"}\n zig: ${zigLines[idx] ?? "<missing>"}`);
}
}
assert.fail(`run transcripts diverge (${diffs.length} lines):\n${diffs.join("\n")}`);
}
} finally {
fs.rmSync(work, { recursive: true, force: true });
}
});