code: func (g *AcyclicGraph) ReverseDepthFirstWalk(start []Vertex, f DepthWalkFunc) error {
  	defer g.debug.BeginOperation(typeReverseDepthFirstWalk, "").End("")
  
  	seen := make(map[Vertex]struct{})
  	frontier := make([]*vertexAtDepth, len(start))
  	for i, v := range start {
  		frontier[i] = &vertexAtDepth{
  			Vertex: v,
  			Depth:  0,
  		}
  	}
  	for len(frontier) > 0 {
  		// Pop the current vertex
  		n := len(frontier)
  		current := frontier[n-1]
  		frontier = frontier[:n-1]
  
  		// Check if we've seen this already and return...
  		if _, ok := seen[current.Vertex]; ok {
  			continue
  		}
  		seen[current.Vertex] = struct{}{}
  
  		// Add next set of targets in a consistent order.
  		targets := AsVertexList(g.UpEdges(current.Vertex))
  		sort.Sort(byVertexName(targets))
  		for _, t := range targets {
  			frontier = append(frontier, &vertexAtDepth{
  				Vertex: t,
  				Depth:  current.Depth + 1,
  			})
  		}
  
  		// Visit the current node
  		if err := f(current.Vertex, current.Depth); err != nil {
  			return err
  		}
  	}
  
  	return nil
  }
docs: // reverseDepthFirstWalk does a depth-first walk _up_ the graph starting from
  // the vertices in start.