 	/// 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,
+		SearchSpace: IncidenceGraph & VertexListGraph,
 		Distance: GraphDistanceMeasure,
 		EdgeWeightMap: GraphEdgePropertyMap,
 		Visitor: DijkstraVisitor
 	>(
-		_ graph: inout Graph,
+		_ graph: inout SearchSpace,
 		visitor: inout Visitor,
 		edgeWeightMap: EdgeWeightMap,
-		startAt startVertex: Graph.VertexId
-	) throws -> TableVertexPropertyMap<Graph, Distance>
+		startAt startVertex: SearchSpace.VertexId
+	) throws -> TableVertexPropertyMap<SearchSpace, Distance>
 	where
-		Graph.VertexId: IdIndexable,
-		EdgeWeightMap.Graph == Graph,
+		SearchSpace.VertexId: IdIndexable,
+		EdgeWeightMap.Graph == SearchSpace,
 		EdgeWeightMap.Value == Distance,
-		Visitor.Graph == Graph
+		Visitor.Graph == SearchSpace
 	{
 		var colorMap = TableVertexPropertyMap(repeating: VertexColor.white, for: graph)
 		var vertexDistanceMap = TableVertexPropertyMap(

		}
	}

	public mutating func grayDestination(_ edge: Graph.EdgeId, _ graph: inout Graph) throws {
		let decreased = relaxTarget(edge, &graph)
		if decreased {
			try visitor.edgeRelaxed(edge, &graph)

		}
	}

	public mutating func blackDestination(_ edge: SearchSpace.EdgeId, _ graph: inout Graph) throws {
		try visitor.edgeNotRelaxed(edge, &graph)
	}

	public mutating func finish(vertex: SearchSpace.VertexId, _ graph: inout Graph) throws {
		try visitor.finish(vertex: vertex, &graph)
	}

	/// Returns `true` if `edge` relaxes the distance to `graph.target(of: edge)`, false otherwise.
	private mutating func relaxTarget(_ edge: SearchSpace.EdgeId, _ graph: inout Graph) -> Bool {
		let destination = graph.destination(of: edge)
		let sourceDistance = vertexDistanceMap.get(graph, graph.source(of: edge))
		let destinationDistance = vertexDistanceMap.get(graph, destination)
