import graph {
	Edge
}

by ("ThorstenSeitz")
shared interface UndirectedEdge<Vertex,E> of E satisfies Edge<Vertex,E>
		given Vertex satisfies Object
		given E satisfies Edge<Vertex,E> { // should be UndirectedEdge<Vertex,E> but clashes with definition of Edge

	shared actual Boolean isDirected => false;

	shared actual Boolean isIncident(Vertex vertex) => source == vertex || target == vertex;

	shared default E asOutgoing(Object vertex) {
		if (source == vertex) {
			return self;
		} else {
			assert (target == vertex);
			return reversed;
		}
	}
}