 		StartCollection.Element == VertexId
 	{
 		// Super-step 0 starts by initializing everything & gets things going.
-		step(mailboxes: &mailboxes) { (vertexId, vertex, mailbox, graph) in
-			assert(mailbox.inbox == nil, "Mailbox was not empty on the first step.")
-			if startVerticies.contains(vertexId) {
-				vertex.predecessor = vertexId
+		step(mailboxes: &mailboxes) { (context, vertex) in
+			assert(context.inbox == nil, "Mailbox was not empty on the first step.")
+			if startVerticies.contains(context.vertex) {
+				vertex.predecessor = context.vertex
 				vertex.distance = .zero
-				for edge in graph.edges(from: vertexId) {
-					mailbox.send(
-						DistanceSearchMessage(predecessor: vertexId, distance: .zero),
-						to: graph.destination(of: edge))
+				for edge in context.edges {
+					context.send(
+						DistanceSearchMessage(predecessor: context.vertex, distance: .zero),
+						to: context.destination(of: edge))
 				}
 			} else {
 				vertex.distance = .effectiveInfinity

	) -> Int
	where Mailboxes.Mailbox.Graph == Self, Mailboxes.Mailbox.Message == EmptyMergeableMessage {
		// Super-step 0 starts everything going and does a slightly different operation.
		step(mailboxes: &mailboxes) { (vertexId, vertex, mailbox, graph) in
			assert(mailbox.inbox == nil, "Mailbox was not empty on the first step.")
			if vertex.isReachable {
				for edge in graph.edges(from: vertexId) {
					mailbox.send(EmptyMergeableMessage(), to: graph.destination(of: edge))
				}
			}
		}

		// While we're still sending messages...
		while mailboxes.deliver() {
			stepCount += 1
			step(mailboxes: &mailboxes) { (context, vertex) in
				let startedReachable = vertex.isReachable
				if !startedReachable && context.inbox != nil {
					vertex.isReachable = true
					for edge in context.edges {
						context.send(EmptyMergeableMessage(), to: context.destination(of: edge))
					}
				}
			}
