docs: def euler_tour_dfs(G, source=None):
      """ adaptation of networkx dfs """
      if source is None:
          # produce edges for all components
          nodes = G
      else:
          # produce edges for components with source
          nodes = [source]
      yielder = []
      visited = set()
      for start in nodes:
          if start in visited:
              continue
          visited.add(start)
          stack = [(start, iter(G[start]))]
          while stack:
              parent, children = stack[-1]
              try:
                  child = next(children)
                  if child not in visited:
                      # yielder += [[parent, child]]
                      yielder += [parent]
                      visited.add(child)
                      stack.append((child, iter(G[child])))
              except StopIteration:
                  if stack:
                      last = stack[-1]
                      yielder += [last[0]]
                  stack.pop()
      return yielder