 	/// graph algorithms. Use this overload if you are interested in manually controlling every
 	/// aspect. If you would like a higher-level abstraction, consider `dijkstraSearch`.
 	static func dijkstraSearchNoInit<
-		Graph: IncidenceGraph & VertexListGraph,
+		SearchSpace: IncidenceGraph & VertexListGraph,
 		Distance: GraphDistanceMeasure,
 		EdgeWeightMap: GraphEdgePropertyMap,
 		VertexDistanceMap: MutableGraphVertexPropertyMap,
 		ColorMap: MutableGraphVertexPropertyMap,
 		Visitor: DijkstraVisitor
 	>(
-		_ graph: inout Graph,
+		_ graph: inout SearchSpace,
 		visitor: inout Visitor,
 		colorMap: inout ColorMap,
 		vertexDistanceMap: inout VertexDistanceMap,
 		edgeWeightMap: EdgeWeightMap,
-		startAt startVertex: Graph.VertexId
+		startAt startVertex: SearchSpace.VertexId
 	) throws
 	where
-		Graph.VertexId: IdIndexable,
-		EdgeWeightMap.Graph == Graph,
+		SearchSpace.VertexId: IdIndexable,
+		EdgeWeightMap.Graph == SearchSpace,
 		EdgeWeightMap.Value == Distance,
-		VertexDistanceMap.Graph == Graph,
+		VertexDistanceMap.Graph == SearchSpace,
 		VertexDistanceMap.Value == Distance,
-		ColorMap.Graph == Graph,
+		ColorMap.Graph == SearchSpace,
 		ColorMap.Value == VertexColor,
-		Visitor.Graph == Graph
+		Visitor.Graph == SearchSpace
 	{
 		vertexDistanceMap.set(vertex: startVertex, in: &graph, to: Distance.zero)
 		var dijkstraVisitor = DijkstraBFSVisitor(

	/// Executes Dijkstra's search algorithm over `graph` from `startVertex` using edge weights from
	/// `edgeWeightMap`, calling `visitor` along the way.
	static func dijkstraSearch<
		Graph: IncidenceGraph & VertexListGraph,
		Distance: GraphDistanceMeasure,
		EdgeWeightMap: GraphEdgePropertyMap,
		Visitor: DijkstraVisitor
	>(
		_ graph: inout Graph,
		visitor: inout Visitor,
		edgeWeightMap: EdgeWeightMap,
		startAt startVertex: Graph.VertexId
	) throws -> TableVertexPropertyMap<Graph, Distance>
	where
		Graph.VertexId: IdIndexable,
		EdgeWeightMap.Graph == Graph,
		EdgeWeightMap.Value == Distance,
		Visitor.Graph == Graph
	{
		var colorMap = TableVertexPropertyMap(repeating: VertexColor.white, for: graph)
		var vertexDistanceMap = TableVertexPropertyMap(


/// Implements the majority of Dijkstra's algorithm in terms of BreadthFirstSearch.
private struct DijkstraBFSVisitor<
	SearchSpace: IncidenceGraph & VertexListGraph,
	Distance: GraphDistanceMeasure,
	EdgeWeightMap: GraphEdgePropertyMap,
	VertexDistanceMap: MutableGraphVertexPropertyMap,
	Visitor: DijkstraVisitor
>: BFSVisitor
where
	SearchSpace.VertexId: IdIndexable,
	EdgeWeightMap.Graph == SearchSpace,
	EdgeWeightMap.Value == Distance,
	VertexDistanceMap.Graph == SearchSpace,
	VertexDistanceMap.Value == Distance,
	Visitor.Graph == SearchSpace
{
	/// The graph we're operating on is `SearchSpace`.
	public typealias Graph = SearchSpace

	/// The queue of verticies to visit.
	var queue = ConfigurableHeap<
		SearchSpace.VertexId,
		Distance,
		Int32,  // TODO: make configurable!
		_IdIndexibleDictionaryHeapIndexer<SearchSpace.VertexId, _ConfigurableHeapCursor<Int32>>>()
	/// The weights of the edges.
	let edgeWeightMap: EdgeWeightMap
	/// The distances from the start vertex to the final verticies.
