Async Workflows and Source Panels
Typed Event Queue
Model queued work as typed data before replaying each queue step.
Typed Event Queue
typed_event_queue.ts
type QueueEvent = {
name: "read" | "audit" | "write" | "render";
cost: number;
};
const extra: QueueEvent["name"] = ;
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"] = ;
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"] = ;
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}`);
typed queue
A queue can be replayed without timers when each queued event is represented as deterministic typed data.