function createNodes(hNodes, wcs) {
const ns = new Map([...createNodeIds(hNodes)].map((d) => [d, {}]));
const g = new Graph();
for (const edge of createEdges(hNodes, wcs).values()) {
g.addEdge(edge.source, edge.target);
}
g.topologicalSort().forEach((nodeName) => {
const inNodes = g.inNodes(nodeName).map((n) => ns.get(n));
if (inNodes.length === 0) {
return ns.set(nodeName, { strahler: 1, shreve: 1 });
}
const strahler = inNodes.map((n) => n.strahler);
const [min, max] = d3.extent(strahler);
ns.set(nodeName, {
strahler: inNodes.length === 1 || min < max ? max : max + 1,
shreve: d3.sum(inNodes, (n) => n.shreve)
});
});
return ns;
}