collab/mermaid/packages/mermaid-layout-elk/src/find-common-ancestor.tsblame
View source
6dd74de1export interface TreeData {
6dd74de2 parentById: Record<string, string>;
6dd74de3 childrenById: Record<string, string[]>;
6dd74de4}
6dd74de5
6dd74de6export const findCommonAncestor = (id1: string, id2: string, { parentById }: TreeData) => {
6dd74de7 const visited = new Set();
6dd74de8 let currentId = id1;
6dd74de9
6dd74de10 // Edge case with self edges
6dd74de11 if (id1 === id2) {
6dd74de12 return parentById[id1] || 'root';
6dd74de13 }
6dd74de14
6dd74de15 while (currentId) {
6dd74de16 visited.add(currentId);
6dd74de17 if (currentId === id2) {
6dd74de18 return currentId;
6dd74de19 }
6dd74de20 currentId = parentById[currentId];
6dd74de21 }
6dd74de22
6dd74de23 currentId = id2;
6dd74de24 while (currentId) {
6dd74de25 if (visited.has(currentId)) {
6dd74de26 return currentId;
6dd74de27 }
6dd74de28 currentId = parentById[currentId];
6dd74de29 }
6dd74de30
6dd74de31 return 'root';
6dd74de32};