graph_traits/
lib.rs

1#[cfg(feature = "petgraph")]
2mod petgraph;
3
4pub trait GraphBase {
5	type NodeID: Copy;
6	type EdgeID: Copy;
7}
8
9pub trait GraphNodeAddable<N>: GraphBase {
10	fn add_node(&mut self, data: N) -> Self::NodeID;
11}
12
13pub trait GraphEdgeAddable<E>: GraphBase {
14	fn add_edge(&mut self, a: Self::NodeID, b: Self::NodeID, data: E) -> Self::EdgeID;
15}
16
17pub trait GraphNodeRemovable<N>: GraphBase {
18	fn remove_node(&mut self, id: Self::NodeID) -> N;
19}
20
21pub trait GraphEdgeRemovable<E>: GraphBase {
22	fn remove_edge(&mut self, id: Self::EdgeID) -> E;
23}
24
25pub trait GraphNodeIndexable<N>: GraphBase {
26	fn node(&self, id: Self::NodeID) -> &N;
27}
28
29pub trait GraphNodeMutIndexable<N>: GraphBase + GraphNodeIndexable<N> {
30	fn node_mut(&mut self, id: Self::NodeID) -> &mut N;
31}
32
33pub trait GraphEdgeIndexable<E>: GraphBase {
34	fn edge(&self, id: Self::EdgeID) -> &E;
35}
36
37pub trait GraphEdgeMutIndexable<E>: GraphBase + GraphEdgeIndexable<E> {
38	fn edge_mut(&mut self, id: Self::EdgeID) -> &mut E;
39}
40
41pub trait GraphEdgeTo: GraphBase {
42	fn edge_to(&self, id: Self::EdgeID) -> Self::NodeID;
43}
44
45pub trait GraphEdgeFrom: GraphBase + GraphEdgeTo {
46	fn edge_from(&self, id: Self::EdgeID) -> Self::NodeID;
47}
48
49pub trait GraphEdgeEndpoints: GraphBase + GraphEdgeFrom + GraphEdgeTo {
50	fn edge_endpoints(&self, id: Self::EdgeID) -> (Self::NodeID, Self::NodeID) {
51		(self.edge_from(id), self.edge_to(id))
52	}
53}
54
55pub trait GraphEdgesFrom: GraphBase {
56	type EdgesFromOutput;
57
58	fn edges_from(&self, id: Self::NodeID) -> Self::EdgesFromOutput;
59}