{"version":3,"sources":["../../../../src/utils/traversers/types.ts","../../../../src/utils/traversers/bfs.ts","../../../../src/utils/traversers/dfs.ts"],"sourcesContent":["export const SKIP = \"skip\" as const;\nexport const STOP = false;\nexport const CONTINUE = true;\n\nexport type Action = typeof CONTINUE | typeof SKIP | typeof STOP | void;\n\nexport type TraverserVisit<N, P extends N = N> = (node: N, parents: readonly P[]) => Action;\nexport type TraverserGetChildren<N, P extends N = N> = (parent: P) => readonly N[];\n\nexport type DeleterAction = \"deleted\" | \"should-delete-parent\" | \"noop\";\n","import { SKIP, STOP, type TraverserGetChildren, type TraverserVisit } from \"./types\";\n\nexport function bfs<N, P extends N = N>(\n    root: N,\n    visit: TraverserVisit<N, P>,\n    getChildren: TraverserGetChildren<N, P>,\n    isParent: (node: N) => node is P = (node): node is P => true\n): void {\n    const queue: [N, P[]][] = [[root, []]];\n    while (queue.length > 0) {\n        const [node, parents] = queue.shift() ?? [];\n        if (!node) {\n            continue;\n        }\n        const next = visit(node, parents ?? []);\n\n        if (next === SKIP) {\n            continue;\n        } else if (next === STOP) {\n            return;\n        }\n\n        if (isParent(node)) {\n            for (const child of [...getChildren(node)]) {\n                queue.push([child, [...(parents ?? []), node]]);\n            }\n        }\n    }\n}\n","import { SKIP, STOP, type TraverserGetChildren, type TraverserVisit } from \"./types\";\n\nexport function dfs<N, P extends N = N>(\n    root: N,\n    visit: TraverserVisit<N, P>,\n    getChildren: TraverserGetChildren<N, P>,\n    isParent: (node: N) => node is P = (node): node is P => true\n): void {\n    const stack: [N, P[]][] = [[root, []]];\n    while (stack.length > 0) {\n        const [node, parents] = stack.pop() ?? [];\n        if (!node) {\n            continue;\n        }\n        const next = visit(node, parents ?? []);\n\n        if (next === SKIP) {\n            continue;\n        } else if (next === STOP) {\n            return;\n        }\n\n        if (isParent(node)) {\n            for (const child of [...getChildren(node)].reverse()) {\n                stack.push([child, [...(parents ?? []), node]]);\n            }\n        }\n    }\n}\n"],"mappings":";AAAO,IAAM,OAAO;AACb,IAAM,OAAO;AACb,IAAM,WAAW;;;ACAjB,SAAS,IACZ,MACA,OACA,aACA,WAAmC,CAAC,SAAoB,MACpD;AACJ,QAAM,QAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACrC,SAAO,MAAM,SAAS,GAAG;AACrB,UAAM,CAAC,MAAM,OAAO,IAAI,MAAM,MAAM,KAAK,CAAC;AAC1C,QAAI,CAAC,MAAM;AACP;AAAA,IACJ;AACA,UAAM,OAAO,MAAM,MAAM,WAAW,CAAC,CAAC;AAEtC,QAAI,SAAS,MAAM;AACf;AAAA,IACJ,WAAW,SAAS,MAAM;AACtB;AAAA,IACJ;AAEA,QAAI,SAAS,IAAI,GAAG;AAChB,iBAAW,SAAS,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG;AACxC,cAAM,KAAK,CAAC,OAAO,CAAC,GAAI,WAAW,CAAC,GAAI,IAAI,CAAC,CAAC;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AACJ;;;AC1BO,SAAS,IACZ,MACA,OACA,aACA,WAAmC,CAAC,SAAoB,MACpD;AACJ,QAAM,QAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACrC,SAAO,MAAM,SAAS,GAAG;AACrB,UAAM,CAAC,MAAM,OAAO,IAAI,MAAM,IAAI,KAAK,CAAC;AACxC,QAAI,CAAC,MAAM;AACP;AAAA,IACJ;AACA,UAAM,OAAO,MAAM,MAAM,WAAW,CAAC,CAAC;AAEtC,QAAI,SAAS,MAAM;AACf;AAAA,IACJ,WAAW,SAAS,MAAM;AACtB;AAAA,IACJ;AAEA,QAAI,SAAS,IAAI,GAAG;AAChB,iBAAW,SAAS,CAAC,GAAG,YAAY,IAAI,CAAC,EAAE,QAAQ,GAAG;AAClD,cAAM,KAAK,CAAC,OAAO,CAAC,GAAI,WAAW,CAAC,GAAI,IAAI,CAAC,CAAC;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AACJ;","names":[]}