From 98b07524418815bd788d28fa135adc28b7abe9f5 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Tue, 12 Aug 2025 07:48:28 +0200 Subject: [PATCH] added basic scheduler and tree walker --- examples/client-renderer/src/cr.ts | 49 ++++++++++++++++++++++++++ examples/client-renderer/tsconfig.json | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/examples/client-renderer/src/cr.ts b/examples/client-renderer/src/cr.ts index e69de29..95206b4 100644 --- a/examples/client-renderer/src/cr.ts +++ b/examples/client-renderer/src/cr.ts @@ -0,0 +1,49 @@ +interface FiberNode { + child?: FiberNode; + sibling?: FiberNode; + parent?: FiberNode; +} + +let unitOfWork: FiberNode | null = null; + +function performUnitOfWork(fiber: FiberNode) { + console.log("performUnitOfWork", fiber); + + if (fiber.child) { + return fiber.child; + } + + let nextFiber: FiberNode | undefined = fiber; + while (nextFiber) { + if (nextFiber.sibling) { + return nextFiber.sibling; + } + nextFiber = nextFiber.parent; + } + + return null; +} + +function workLoop(deadline: IdleDeadline) { + while (unitOfWork && deadline.timeRemaining() > 0) { + unitOfWork = performUnitOfWork(unitOfWork); + } + + if (unitOfWork) { + requestIdleCallback(workLoop); + } else { + // Commit all the changes that have accumulated. + } +} + +function linkParents(fiber: FiberNode, parent?: FiberNode) { + fiber.parent = parent; + if (fiber.child) { + linkParents(fiber.child, fiber); + } + if (fiber.sibling) { + linkParents(fiber.sibling, fiber); + } +} + +requestIdleCallback(workLoop); diff --git a/examples/client-renderer/tsconfig.json b/examples/client-renderer/tsconfig.json index bfa0fea..be3d138 100644 --- a/examples/client-renderer/tsconfig.json +++ b/examples/client-renderer/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { // Environment setup & latest features - "lib": ["ESNext"], + "lib": ["ESNext", "DOM"], "target": "ESNext", "module": "Preserve", "moduleDetection": "force",