import graph {
	Edge,
	IncidenceGraph
}
import graph.traversal.visitor {
	EdgeVisitor
}

by ("ThorstenSeitz")
shared class EdgePropagator<V,E,G>(G graph, EdgeVisitor<V,E> visitor, V source) extends GraphPropagator<V,E>(visitor, source)
		given V satisfies Object
		given E satisfies Edge<V,E>
		given G satisfies IncidenceGraph<V,E> {

	shared actual {E*} adjacencies => graph.adjacentEdges(source);

	shared actual V target(E edge) => edge.target;

	shared actual void backEdge(E edge) => visitor.backEdge(edge);

	shared actual void examineEdge(E edge) => visitor.examineEdge(edge);

	shared actual void forwardEdge(E edge) => visitor.forwardEdge(edge);

	shared actual void nonTreeEdge(E edge) => visitor.nonTreeEdge(edge);

	shared actual void treeEdge(E edge) => visitor.treeEdge(edge);
}

shared class EdgePropagatorFactory<V,E,G>(G graph, EdgeVisitor<V,E> visitor) extends PropagatorFactory<V,E,EdgePropagator<V,E,G>>(visitor)
		given V satisfies Object
		given E satisfies Edge<V,E>
		given G satisfies IncidenceGraph<V,E> {

	shared actual EdgePropagator<V,E,G> propagator(V source) => EdgePropagator(graph, visitor, source);
}