Async Workflows and Source Panels
Typed Event Queue
Model queued work as typed data before replaying each queue step.
typed queue
A queue can be replayed without timers when each queued event is represented as deterministic typed data.
Typed Event Queue
typed_event_queue.ts
Replay: real traced execution (multi-file project)
type QueueEvent = {
name: "read" | "audit" | "write" | "render";
cost: number;
};
const extra: QueueEvent["name"] = "audit";
const queue: QueueEvent[] = [
{ name: "read", cost: 1 },
{ name: extra, cost: 2 },
{ name: "write", cost: 3 }
];
let log: string[] = [];
let totalCost: number = 0;
while (queue.length > 0) {
const event: QueueEvent | undefined = queue.shift();
if (event !== undefined) {
totalCost += event.cost;
log.push(`run:${event.name}`);
}
}
console.log(`extra=${extra}`);
console.log(`log=${log.join(",")}`);
console.log(`total=${totalCost}`);
type QueueEvent = {
name: "read" | "audit" | "write" | "render";
cost: number;
};
const extra: QueueEvent["name"] = "read";
const queue: QueueEvent[] = [
{ name: "read", cost: 1 },
{ name: extra, cost: 2 },
{ name: "write", cost: 3 }
];
let log: string[] = [];
let totalCost: number = 0;
while (queue.length > 0) {
const event: QueueEvent | undefined = queue.shift();
if (event !== undefined) {
totalCost += event.cost;
log.push(`run:${event.name}`);
}
}
console.log(`extra=${extra}`);
console.log(`log=${log.join(",")}`);
console.log(`total=${totalCost}`);
type QueueEvent = {
name: "read" | "audit" | "write" | "render";
cost: number;
};
const extra: QueueEvent["name"] = "render";
const queue: QueueEvent[] = [
{ name: "read", cost: 1 },
{ name: extra, cost: 2 },
{ name: "write", cost: 3 }
];
let log: string[] = [];
let totalCost: number = 0;
while (queue.length > 0) {
const event: QueueEvent | undefined = queue.shift();
if (event !== undefined) {
totalCost += event.cost;
log.push(`run:${event.name}`);
}
}
console.log(`extra=${extra}`);
console.log(`log=${log.join(",")}`);
console.log(`total=${totalCost}`);
extra ← audit, queue ← [object Object],[object Object],[object Object]
3 cost: number;4};56const extra→ audit: QueueEvent["name"] = "audit"; //@extra="read", "render"7const queue→ [object Object],[object Object],[object Object]: QueueEvent[] = [8 { name: "read", cost: 1 },9 { name: extraaudit, cost: 2 },10 { name: "write", cost: 3 }11];1213let log: string[] = [];14let totalCost→ 0: number = 0;queue ← [object Object],[object Object], event ← [object Object]
pass 1 of 313let log: string[] = [];14let totalCost: number = 0;1516while (queue.length3 > 0) {17 const event→ [object Object]: QueueEvent | undefined = queue→ [object Object],[object Object].shift();All 3 passes — pass 1 is the card above pass queue.lengthqueueevent1 3 [object Object],[object Object],[object Object] → [object Object],[object Object] [object Object] 2 2 [object Object],[object Object] → [object Object] [object Object] 3 1 [object Object] → (empty) [object Object] if (event !== undefined)
pass 1 of 316while (queue.length > 0) {17 const event: QueueEvent | undefined = queue.shift();1819 if (event[object Object] !== undefined) {20 totalCost += event.cost1;21 log.push(`run:${event.nameread}`);22 }All 3 passes — pass 1 is the card above pass event.costevent.name1 1 read 2 2 audit 3 3 write console.log(`extra=${extra}`);
22 }23}2425console.log(`extra=${extraaudit}`);26console.log(`log=${log.join(",")}`);27console.log(`total=${totalCost6}`);outputextra=audit log=run:read,run:audit,run:write total=6
extra ← read, queue ← [object Object],[object Object],[object Object]
3 cost: number;4};56const extra→ read: QueueEvent["name"] = "read";7const queue→ [object Object],[object Object],[object Object]: QueueEvent[] = [8 { name: "read", cost: 1 },9 { name: extraread, cost: 2 },10 { name: "write", cost: 3 }11];1213let log: string[] = [];14let totalCost→ 0: number = 0;queue ← [object Object],[object Object], event ← [object Object]
pass 1 of 313let log: string[] = [];14let totalCost: number = 0;1516while (queue.length3 > 0) {17 const event→ [object Object]: QueueEvent | undefined = queue→ [object Object],[object Object].shift();All 3 passes — pass 1 is the card above pass queue.lengthqueueevent1 3 [object Object],[object Object],[object Object] → [object Object],[object Object] [object Object] 2 2 [object Object],[object Object] → [object Object] [object Object] 3 1 [object Object] → (empty) [object Object] if (event !== undefined)
pass 1 of 316while (queue.length > 0) {17 const event: QueueEvent | undefined = queue.shift();1819 if (event[object Object] !== undefined) {20 totalCost += event.cost1;21 log.push(`run:${event.nameread}`);22 }All 3 passes — pass 1 is the card above pass event.costevent.name1 1 read 2 2 read 3 3 write console.log(`extra=${extra}`);
22 }23}2425console.log(`extra=${extraread}`);26console.log(`log=${log.join(",")}`);27console.log(`total=${totalCost6}`);outputextra=read log=run:read,run:read,run:write total=6
extra ← render, queue ← [object Object],[object Object],[object Object]
3 cost: number;4};56const extra→ render: QueueEvent["name"] = "render";7const queue→ [object Object],[object Object],[object Object]: QueueEvent[] = [8 { name: "read", cost: 1 },9 { name: extrarender, cost: 2 },10 { name: "write", cost: 3 }11];1213let log: string[] = [];14let totalCost→ 0: number = 0;queue ← [object Object],[object Object], event ← [object Object]
pass 1 of 313let log: string[] = [];14let totalCost: number = 0;1516while (queue.length3 > 0) {17 const event→ [object Object]: QueueEvent | undefined = queue→ [object Object],[object Object].shift();All 3 passes — pass 1 is the card above pass queue.lengthqueueevent1 3 [object Object],[object Object],[object Object] → [object Object],[object Object] [object Object] 2 2 [object Object],[object Object] → [object Object] [object Object] 3 1 [object Object] → (empty) [object Object] if (event !== undefined)
pass 1 of 316while (queue.length > 0) {17 const event: QueueEvent | undefined = queue.shift();1819 if (event[object Object] !== undefined) {20 totalCost += event.cost1;21 log.push(`run:${event.nameread}`);22 }All 3 passes — pass 1 is the card above pass event.costevent.name1 1 read 2 2 render 3 3 write console.log(`extra=${extra}`);
22 }23}2425console.log(`extra=${extrarender}`);26console.log(`log=${log.join(",")}`);27console.log(`total=${totalCost6}`);outputextra=render log=run:read,run:render,run:write total=6