func ConnectedSubgraph()

in pkg/cloud/rgraph/algo/traversal/traversal.go [30:74]


func ConnectedSubgraph(g *rgraph.Graph, n rnode.Node) ([]rnode.Node, error) {
	if g.Get(n.ID()) == nil {
		return nil, fmt.Errorf("starting node %s not in graph", n.ID())
	}

	done := map[cloud.ResourceMapKey]rnode.Node{}

	var work algo.Queue[rnode.Node]
	work.Add(n)

	for !work.Empty() {
		cur := work.Pop()
		done[cur.ID().MapKey()] = cur

		refs := cur.OutRefs()
		for _, ref := range refs {
			if _, ok := done[ref.To.MapKey()]; ok {
				continue
			}
			to := g.Get(ref.To)
			if to == nil {
				return nil, fmt.Errorf("invalid graph: to node %v not in graph", ref.To)
			}
			work.Add(to)
		}
		refs = cur.InRefs()
		for _, ref := range refs {
			if _, ok := done[ref.From.MapKey()]; ok {
				continue
			}
			from := g.Get(ref.From)
			if from == nil {
				return nil, fmt.Errorf("invalid graph: from node %v not in graph", ref.From)
			}
			work.Add(from)
		}
	}

	var ret []rnode.Node
	for _, node := range done {
		ret = append(ret, node)
	}

	return ret, nil
}