...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package sampleconversion
16
17 import (
18 "sort"
19
20 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/util/slice"
21 )
22
23 type DependencyGraph struct {
24
25
26 edges map[string][]string
27 }
28
29 func NewDependencyGraph() *DependencyGraph {
30 edges := make(map[string][]string)
31 return &DependencyGraph{edges: edges}
32 }
33
34
35
36
37 func (d *DependencyGraph) AddDependencyWithTFRefVal(tfRefValOfReferencee, referencer string) {
38 referencee, _ := extractReferencedTFTypeAndField(tfRefValOfReferencee)
39 d.addDependency(referencee, referencer)
40 }
41
42
43
44 func (d *DependencyGraph) addDependency(referencee, referencer string) {
45 referencerList := make([]string, 0)
46 if _, ok := d.edges[referencee]; ok {
47 referencerList = d.edges[referencee]
48 }
49 referencerList = append(referencerList, referencer)
50 d.edges[referencee] = referencerList
51 }
52
53 func (d *DependencyGraph) TopologicalSort() []string {
54 visited := make(map[string]bool)
55 referencees := make([]string, 0)
56 result := make([]string, 0)
57
58 for referencee, _ := range d.edges {
59 visited[referencee] = false
60 referencees = append(referencees, referencee)
61 }
62 sort.Strings(referencees)
63
64
65 for _, referencee := range referencees {
66 result = topologicalSort(referencee, d.edges, visited, result)
67 }
68
69 slice.Reverse(result)
70 return result
71 }
72
73 func topologicalSort(vertex string, edges map[string][]string, visited map[string]bool, result []string) (updatedResult []string) {
74
75
76
77 if isVisited, ok := visited[vertex]; isVisited || !ok {
78 return result
79 }
80 visited[vertex] = true
81 adjacentList, ok := edges[vertex]
82 if !ok || len(adjacentList) == 0 {
83 result = append(result, vertex)
84 return result
85 }
86 for _, adjacentVertex := range adjacentList {
87 result = topologicalSort(adjacentVertex, edges, visited, result)
88 }
89 result = append(result, vertex)
90 return result
91 }
92
View as plain text