1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#[cfg(feature = "petgraph")]
mod petgraph;

pub trait GraphBase {
	type NodeID: Copy;
	type EdgeID: Copy;
}

pub trait GraphNodeAddable<N>: GraphBase {
	fn add_node(&mut self, data: N) -> Self::NodeID;
}

pub trait GraphEdgeAddable<E>: GraphBase {
	fn add_edge(&mut self, a: Self::NodeID, b: Self::NodeID, data: E) -> Self::EdgeID;
}

pub trait GraphNodeRemovable<N>: GraphBase {
	fn remove_node(&mut self, id: Self::NodeID) -> N;
}

pub trait GraphEdgeRemovable<E>: GraphBase {
	fn remove_edge(&mut self, id: Self::EdgeID) -> E;
}

pub trait GraphNodeIndexable<N>: GraphBase {
	fn node(&self, id: Self::NodeID) -> &N;
}

pub trait GraphNodeMutIndexable<N>: GraphBase + GraphNodeIndexable<N> {
	fn node_mut(&mut self, id: Self::NodeID) -> &mut N;
}

pub trait GraphEdgeIndexable<E>: GraphBase {
	fn edge(&self, id: Self::EdgeID) -> &E;
}

pub trait GraphEdgeMutIndexable<E>: GraphBase + GraphEdgeIndexable<E> {
	fn edge_mut(&mut self, id: Self::EdgeID) -> &mut E;
}

pub trait GraphEdgeTo: GraphBase {
	fn edge_to(&self, id: Self::EdgeID) -> Self::NodeID;
}

pub trait GraphEdgeFrom: GraphBase + GraphEdgeTo {
	fn edge_from(&self, id: Self::EdgeID) -> Self::NodeID;
}

pub trait GraphEdgeEndpoints: GraphBase + GraphEdgeFrom + GraphEdgeTo {
	fn edge_endpoints(&self, id: Self::EdgeID) -> (Self::NodeID, Self::NodeID) {
		(self.edge_from(id), self.edge_to(id))
	}
}

pub trait GraphEdgesFrom: GraphBase {
	type EdgesFromOutput;

	fn edges_from(&self, id: Self::NodeID) -> Self::EdgesFromOutput;
}