protected static <V, E extends GEdge<V>> V unifySources(
			MutableGDirectedGraphWrapper<V, E> graph, GraphNavigator<V, E> graphNavigator) {

		//
		//							Unusual Code Alert!
		// This method engages in some chicanery.  We may need to update the graph, in the case
		// where there are multiple roots.  In that case, we need to add vertices and edges to
		// our graph.  The issue is that whatever we create will not be of the same type that
		// is in the graph, since we don't know how to create a V or E.  So, just add an 
		// object of our choosing and feel confident that we are the only user of the newly
		// 'forced-in' types.
		//
		// The warnings that arise from this code are suppressed below.
		//

		Set<V> sources = graphNavigator.getSources(graph);
		if (sources.isEmpty()) {
			throw new IllegalArgumentException(
				"The graph does not contain at least one source node");
		}

		if (sources.size() == 1) {
			return CollectionUtils.any(sources);
		}

		// Turn the sources into children of a single root.
		V dummy = graph.addDummyVertex(DUMMY_ROOT_NAME);
		sources.forEach(s -> {
			if (graphNavigator.isTopDown()) {
				graph.addDummyEdge(dummy, s);
			}
			else {
				graph.addDummyEdge(s, dummy);
			}
		});
		return dummy;
	}
Converts multiple source/root nodes in a graph into a single source of which those become
children.

@param graph the graph
@param graphNavigator the navigator to determine graph direction
@return the new single source
@throws IllegalArgumentException if there is not at least one source node in the graph
Ghidra/Framework/Graph/src/main/java/ghidra/graph/algo/AbstractDominanceAlgorithm.java