From 602145c956bb594ca0d0e10601cc4ad1a71cf70d Mon Sep 17 00:00:00 2001 From: Josh Kingsley Date: Sun, 23 Nov 2025 19:27:57 +0200 Subject: feat: integrate web and doc packages --- web/src/doc/index.test.ts | 16 ------ web/src/doc/index.ts | 125 ---------------------------------------------- 2 files changed, 141 deletions(-) delete mode 100644 web/src/doc/index.test.ts delete mode 100644 web/src/doc/index.ts (limited to 'web/src/doc') diff --git a/web/src/doc/index.test.ts b/web/src/doc/index.test.ts deleted file mode 100644 index 5f61398..0000000 --- a/web/src/doc/index.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { expect, test } from "vitest"; -import { apply, defaultDoc, realizeGrids, subdivide } from "."; - -test(realizeGrids, () => { - const doc = defaultDoc(); - const grids = realizeGrids(doc); - - expect(grids.length).toBe(1); - expect(grids[0].rows.length).toBe(4); - expect(grids[0].rows[0].cells.length).toBe(16); - - const doc2 = apply(doc, subdivide(grids[0].id, 0, 0, 3, 3)); - const grids2 = realizeGrids(doc2); - - expect(grids2[0].rows[0].cells.length).toBe(15); -}); diff --git a/web/src/doc/index.ts b/web/src/doc/index.ts deleted file mode 100644 index ae221f0..0000000 --- a/web/src/doc/index.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Immutable, produce } from "immer"; - -export type Doc = Immutable<{ ops: Op[] }>; - -export type Op = CreateGrid | Subdivide; - -export type CreateGrid = Immutable<{ - type: "createGrid"; - gridId: string; - rows: number; - baseCellsPerRow: number; -}>; - -export function createGrid(): CreateGrid { - return { - type: "createGrid", - gridId: crypto.randomUUID(), - rows: 4, - baseCellsPerRow: 16, - }; -} - -export type Subdivide = Immutable<{ - type: "subdivide"; - gridId: string; - rowIndex: number; - startCellIndex: number; - endCellIndex: number; - subdivisions: number; -}>; - -export function subdivide( - gridId: string, - rowIndex: number, - startCellIndex: number, - endCellIndex: number, - subdivisions: number, -): Subdivide { - return { - type: "subdivide", - gridId, - rowIndex, - startCellIndex, - endCellIndex, - subdivisions, - }; -} - -export function defaultDoc(): Doc { - const ops = [createGrid()]; - return { ops }; -} - -export function apply(doc: Doc, ...ops: Op[]): Doc { - return produce(doc, (doc) => { - doc.ops.push(...ops); - }); -} - -export type DocIndex = Immutable<{ - opsByType: Map; -}>; - -export function indexDoc(doc: Doc): DocIndex { - const opsByType = new Map(); - - for (const op of doc.ops) { - opsByType.set(op.type, [...(opsByType.get(op.type) ?? []), op]); - } - - return { opsByType }; -} - -export function getOpsByType( - index: DocIndex, - type: T, -): Extract[] { - return (index.opsByType.get(type) ?? []) as Extract[]; -} - -export type Grid = Immutable<{ id: string; rows: Row[] }>; - -export type Row = Immutable<{ index: number; cells: Cell[] }>; - -export type Cell = Immutable<{}>; - -export function realizeGrids(doc: Doc): Grid[] { - const index = indexDoc(doc); - const createGridOps = getOpsByType(index, "createGrid"); - return createGridOps.map((op) => realizeGrid(doc, index, op)); -} - -function realizeGrid(doc: Doc, index: DocIndex, createOp: CreateGrid): Grid { - const rows = []; - - for (let rowIndex = 0; rowIndex < createOp.rows; rowIndex++) { - let cells: Cell[] = []; - - for (let cellIndex = 0; cellIndex < createOp.baseCellsPerRow; cellIndex++) { - cells.push({ index: cellIndex }); - } - - const subdivideOps = doc.ops.filter( - (op) => - op.type === "subdivide" && - op.gridId === createOp.gridId && - op.rowIndex === rowIndex, - ) as Subdivide[]; - - subdivideOps.forEach((op) => { - cells = [ - ...cells.slice(0, op.startCellIndex), - ...Array.from({ length: op.subdivisions }, () => ({})), - ...cells.slice(op.endCellIndex + 1), - ]; - }); - - rows.push({ index: rowIndex, cells }); - } - - return { - id: createOp.gridId, - rows, - }; -} -- cgit v1.2.3