def each_edge (&block)
      if directed?
        each_vertex { |u|
          each_adjacent(u) { |v| yield u,v }
        }
      else
        each_edge_aux(&block)       # concrete graphs should to this better
      end
    end
def each_edge (&block)
      if directed?
        each_vertex { |u|
          each_adjacent(u) { |v| yield u,v }
        }
      else
        each_edge_aux(&block)       # concrete graphs should to this better
      end
    end
The each_edge iterator should provide efficient access to all edges of the
 graph. Its defines the EdgeListGraph concept.

 This method must _not_ be defined by concrete graph classes, because it
 can be implemented using each_vertex and each_adjacent. However for
 undirected graph the function is inefficient because we must not yield
 (v,u) if we already visited edge (u,v).