code: func (g *Graph) Connect(edge Edge) {
  	g.init()
  	g.debug.Connect(edge)
  
  	source := edge.Source()
  	target := edge.Target()
  	sourceCode := hashcode(source)
  	targetCode := hashcode(target)
  
  	// Do we have this already? If so, don't add it again.
  	if s, ok := g.downEdges[sourceCode]; ok && s.Include(target) {
  		return
  	}
  
  	// Add the edge to the set
  	g.edges.Add(edge)
  
  	// Add the down edge
  	s, ok := g.downEdges[sourceCode]
  	if !ok {
  		s = new(Set)
  		g.downEdges[sourceCode] = s
  	}
  	s.Add(target)
  
  	// Add the up edge
  	s, ok = g.upEdges[targetCode]
  	if !ok {
  		s = new(Set)
  		g.upEdges[targetCode] = s
  	}
  	s.Add(source)
  }
docs: // Connect adds an edge with the given source and target. This is safe to
  // call multiple times with the same value. Note that the same value is
  // verified through pointer equality of the vertices, not through the
  // value of the edge itself.