diff --git a/cmd/digraph/digraph.go b/cmd/digraph/digraph.go
index b11ab77..5253ae8 100644
--- a/cmd/digraph/digraph.go
+++ b/cmd/digraph/digraph.go
@@ -84,12 +84,6 @@
return nodes
}
-func (s nodeset) addAll(x nodeset) {
- for node := range x {
- s[node] = true
- }
-}
-
// A digraph maps nodes to the non-nil set of their immediate successors.
type digraph map[string]nodeset
@@ -125,17 +119,6 @@
return nodelist(slices.Collect(g.All()))
}
-func (g digraph) transpose() digraph {
- rev := make(digraph)
- for node, edges := range g {
- rev.addNode(node)
- for succ := range edges {
- rev.addEdges(succ, node)
- }
- }
- return rev
-}
-
func (g digraph) sccs() []nodeset {
var sccs []nodeset
for _, comp := range graph.SCCs(g) {
@@ -256,9 +239,13 @@
for node := range g {
nodes[node] = true
}
- rev := g.transpose()
+ rev := graph.NewTranspose(g)
for _, node := range nodes.sort() {
- fmt.Fprintf(stdout, "%d\t%d\t%s\n", len(rev[node]), len(g[node]), node)
+ inDegree := 0
+ for range rev.Out(node) {
+ inDegree++
+ }
+ fmt.Fprintf(stdout, "%d\t%d\t%s\n", inDegree, len(g[node]), node)
}
case "transpose":
@@ -266,8 +253,9 @@
return fmt.Errorf("usage: digraph transpose")
}
var revEdges []string
- for node, succs := range g.transpose() {
- for succ := range succs {
+ rev := graph.NewTranspose(g)
+ for node := range rev.All() {
+ for _, succ := range rev.Out(node) {
revEdges = append(revEdges, fmt.Sprintf("%s %s", node, succ))
}
}
@@ -280,17 +268,18 @@
if len(args) == 0 {
return fmt.Errorf("usage: digraph %s <node> ... ", cmd)
}
- g := g
+ var gr graph.Graph[string] = g
if cmd == "preds" {
- g = g.transpose()
+ gr = graph.NewTranspose(g)
}
result := make(nodeset)
for _, root := range args {
- edges := g[root]
- if edges == nil {
+ if g[root] == nil {
return fmt.Errorf("no such node %q", root)
}
- result.addAll(edges)
+ for _, succ := range gr.Out(root) {
+ result[succ] = true
+ }
}
result.sort().println("\n")
@@ -305,11 +294,11 @@
}
roots[root] = true
}
- g := g
+ var gr graph.Graph[string] = g
if cmd == "reverse" {
- g = g.transpose()
+ gr = graph.NewTranspose(g)
}
- nodeset(graph.Reachable(g, roots.sort()...)).sort().println("\n")
+ nodeset(graph.Reachable(gr, roots.sort()...)).sort().println("\n")
case "somepath":
if len(args) != 2 {
@@ -387,9 +376,9 @@
}
}
- gtrans := g.transpose()
+ gtrans := graph.NewTranspose(g)
for from := range graph.Reachable(gtrans, node) {
- for to := range gtrans[from] {
+ for _, to := range gtrans.Out(from) {
edges[fmt.Sprintf("%s %s", to, from)] = struct{}{}
}
}