pkg/model/core/graph/resource_graph.go (35 lines of code) (raw):
package graph
import "reflect"
// unique ID for a resource.
type ResourceUID struct {
ResType reflect.Type
ResID string
}
// ResourceGraph is an abstraction of resource DAG.
type ResourceGraph interface {
// Add a node into ResourceGraph.
AddNode(node ResourceUID)
// Add a edge into ResourceGraph, where dstNode depends on srcNode.
AddEdge(srcNode ResourceUID, dstNode ResourceUID)
// Nodes returns all nodes in ResourceGraph.
Nodes() []ResourceUID
// OutEdgeNodes returns all nodes that depends on this node.
OutEdgeNodes(node ResourceUID) []ResourceUID
}
// NewDefaultResourceGraph constructs new defaultResourceGraph.
func NewDefaultResourceGraph() *defaultResourceGraph {
return &defaultResourceGraph{
nodes: nil,
outEdges: make(map[ResourceUID][]ResourceUID),
}
}
var _ ResourceGraph = &defaultResourceGraph{}
// defaultResourceGraph is the default implementation for ResourceGraph.
type defaultResourceGraph struct {
nodes []ResourceUID
outEdges map[ResourceUID][]ResourceUID
}
// Add a node into ResourceGraph.
func (g *defaultResourceGraph) AddNode(node ResourceUID) {
g.nodes = append(g.nodes, node)
}
// Add a edge into ResourceGraph, where dstNode depends on srcNode.
func (g *defaultResourceGraph) AddEdge(srcNode ResourceUID, dstNode ResourceUID) {
g.outEdges[srcNode] = append(g.outEdges[srcNode], dstNode)
}
// Nodes returns all nodes in ResourceGraph.
func (g *defaultResourceGraph) Nodes() []ResourceUID {
return g.nodes
}
// OutEdgeNodes returns all nodes that depends on this node.
func (g *defaultResourceGraph) OutEdgeNodes(node ResourceUID) []ResourceUID {
return g.outEdges[node]
}