import type { RoomMessage } from "../../../src/core/types.js"; export interface CYPTreeData { ordered: RoomMessage[]; numToId: Map; idToNum: Map; childrenMap: Map; } export function buildCYPTree(messages: RoomMessage[]): CYPTreeData { const childrenMap = new Map(); for (const m of messages) { if (m.parent_id !== null && m.parent_id !== undefined) { const existing = childrenMap.get(m.parent_id); if (existing) { existing.push(m); } else { childrenMap.set(m.parent_id, [m]); } } } const root = messages.find((m) => m.parent_id === null); const ordered: RoomMessage[] = []; const numToId = new Map(); const idToNum = new Map(); if (!root) { return { ordered, numToId, idToNum, childrenMap }; } const queue: RoomMessage[] = [root]; while (queue.length > 0) { const current = queue.shift()!; ordered.push(current); const num = ordered.length; numToId.set(num, current.id); idToNum.set(current.id, num); for (const child of childrenMap.get(current.id) ?? []) { queue.push(child); } } return { ordered, numToId, idToNum, childrenMap }; } export function getSubtreeIds( rootId: string, childrenMap: Map ): Set { const result = new Set(); const queue = [rootId]; while (queue.length > 0) { const id = queue.shift()!; result.add(id); for (const child of childrenMap.get(id) ?? []) { queue.push(child.id); } } return result; }