async function step() {
if (unvisited.size > 0) {
console.log("step...");
function findNearestUnvisited(v) {
var current = stepDijkstra({
seed: { id: v, distance: 0 },
adjacent: (u) =>
[...(edges.get(u)?.keys() || [])]
.map((v) => ({
id: v,
distance: edgeDistance(u, v)
}))
.filter((e) => !exclude.has(e.id))
});
while (current.lastVertex && !unvisited.has(current.lastVertex.id)) {
current = stepDijkstra(current);
}
return current.lastVertex?.id;
}
const u = findNearestUnvisited(initialTerm);
unvisited.delete(u);
const neighbours = await suggestionsFromGoogle({
term: u
});
for (let edge of neighbours) {
if (!edges.has(edge.source)) {
edges.set(edge.source, new Map());
}
const outgoingEdges = edges.get(edge.source);
let v = edge.target;
outgoingEdges.set(v, {
source: edge.source,
target: edge.target,
weight: edge.weight
});
const alt =
distance.get(edge.source) + edgeDistance(edge.source, edge.target);
if (distance.get(v) === undefined) {
distance.set(v, alt);
if (alt < maxDistance) unvisited.add(v);
} else if (alt < distance.get(v)) {
distance.set(v, alt);
}
}
console.log("step: notify epoch");
try {
viewof epoch.value = viewof epoch.value + 1;
viewof epoch.dispatchEvent(new Event("input", { bubbles: true }));
} catch (err) {
console.log(err);
}
if (unvisited.size == 0) {
console.log("step: nearly ending, notify latest version");
viewof version.value = viewof version.value + 1;
viewof version.dispatchEvent(new Event("input", { bubbles: true }));
} else {
if (viewof autoRun.value) {
setTimeout(step, 100);
}
}
} else {
console.log("step: ending, no unvisted nodes");
}
}