@loken/hierarchies
Version:
Library for working with hierarchies of identifiers and identifiable objects.
29 lines (28 loc) • 1.15 kB
JavaScript
import { LinearStack, LinearQueue } from "@loken/utilities";
import { GraphSignal } from "./graph-signal.js";
const traverseGraph = (options) => options.signal !== void 0 ? traverseSignalGraph(options) : traverseFullGraph(options);
function* traverseSignalGraph(options) {
const signal = new GraphSignal(options), signalFn = options.signal;
let res = signal.tryGetNext();
for (; res[1]; )
signalFn(res[0], signal), signal.shouldYield() && (yield res[0]), signal.cleanup(), res = signal.tryGetNext();
}
function* traverseFullGraph(options) {
const visited = options.detectCycles ? /* @__PURE__ */ new Set() : void 0, store = options.type === "depth-first" ? new LinearStack() : new LinearQueue();
store.attach(options.roots);
const nextFn = options.next;
for (; store.count > 0; ) {
const node = store.detach();
if (visited != null && visited.has(node))
continue;
visited == null || visited.add(node), yield node;
const children = nextFn(node);
children && store.attach(children);
}
}
export {
traverseFullGraph,
traverseGraph,
traverseSignalGraph
};
//# sourceMappingURL=graph-traverse.js.map