12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- package grok
- type graph map[string][]string
- func reverseList(s []string) (r []string) {
- for _, i := range s {
- i := i
- defer func() { r = append(r, i) }()
- }
- return
- }
- func sortGraph(g graph) (order, cyclic []string) {
- L := make([]string, len(g))
- i := len(L)
- temp := map[string]bool{}
- perm := map[string]bool{}
- var cycleFound bool
- var cycleStart string
- var visit func(string)
- visit = func(n string) {
- switch {
- case temp[n]:
- cycleFound = true
- cycleStart = n
- return
- case perm[n]:
- return
- }
- temp[n] = true
- for _, m := range g[n] {
- visit(m)
- if cycleFound {
- if cycleStart > "" {
- cyclic = append(cyclic, n)
- if n == cycleStart {
- cycleStart = ""
- }
- }
- return
- }
- }
- delete(temp, n)
- perm[n] = true
- i--
- L[i] = n
- }
- for n := range g {
- if perm[n] {
- continue
- }
- visit(n)
- if cycleFound {
- return nil, cyclic
- }
- }
- return L, nil
- }
|