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

extra
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}`);
  1. 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;
  2. queue ← [object Object],[object Object], event ← [object Object]

    pass 1 of 3
    13let 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
    passqueue.lengthqueueevent
    13[object Object],[object Object],[object Object] [object Object],[object Object][object Object]
    22[object Object],[object Object] [object Object][object Object]
    31[object Object] (empty)[object Object]
  3. if (event !== undefined)

    pass 1 of 3
    16while (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
    passevent.costevent.name
    11read
    22audit
    33write
  4. 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
  1. 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;
  2. queue ← [object Object],[object Object], event ← [object Object]

    pass 1 of 3
    13let 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
    passqueue.lengthqueueevent
    13[object Object],[object Object],[object Object] [object Object],[object Object][object Object]
    22[object Object],[object Object] [object Object][object Object]
    31[object Object] (empty)[object Object]
  3. if (event !== undefined)

    pass 1 of 3
    16while (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
    passevent.costevent.name
    11read
    22read
    33write
  4. 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
  1. 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;
  2. queue ← [object Object],[object Object], event ← [object Object]

    pass 1 of 3
    13let 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
    passqueue.lengthqueueevent
    13[object Object],[object Object],[object Object] [object Object],[object Object][object Object]
    22[object Object],[object Object] [object Object][object Object]
    31[object Object] (empty)[object Object]
  3. if (event !== undefined)

    pass 1 of 3
    16while (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
    passevent.costevent.name
    11read
    22render
    33write
  4. 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