1use crate::{Edge, EdgeID, GraphError, Node, NodeID};
5
6pub trait GraphInterface {
8 type NodeData;
9 type EdgeData;
10
11 fn node_count(&self) -> usize;
12
13 fn nodes(&self) -> impl Iterator<Item = NodeID>;
14
15 fn node(&self, id: NodeID) -> Result<&Node<Self::NodeData>, GraphError>;
16 fn node_mut(&mut self, id: NodeID) -> Result<&mut Node<Self::NodeData>, GraphError>;
17
18 fn edge(&self, id: EdgeID) -> Result<&Edge<Self::EdgeData>, GraphError>;
19 fn edge_mut(&mut self, id: EdgeID) -> Result<&mut Edge<Self::EdgeData>, GraphError>;
20
21 fn add_node(&mut self, data: Self::NodeData) -> NodeID;
22 fn add_nodes(&mut self, data: &[Self::NodeData]) -> Vec<NodeID>
23 where
24 Self::NodeData: Clone;
25
26 fn add_edge(&mut self, from: NodeID, to: NodeID, data: Self::EdgeData) -> EdgeID;
27
28 fn remove_node(&mut self, id: NodeID) -> Result<(), GraphError>;
29 fn remove_edge(&mut self, id: EdgeID) -> Result<(), GraphError>;
30
31 fn add_edges(&mut self, data: &[(NodeID, NodeID)]) -> Vec<EdgeID>
32 where
33 Self::EdgeData: Default + Clone,
34 Self::NodeData: Clone;
35
36 fn remove_nodes(&mut self, ids: &[NodeID]) -> Result<(), GraphError> {
37 for id in ids {
38 self.remove_node(*id)?;
39 }
40 Ok(())
41 }
42
43 fn add_edges_with_data(&mut self, data: &[(NodeID, NodeID, Self::EdgeData)]) -> Vec<EdgeID>
44 where
45 Self::EdgeData: Clone,
46 {
47 let mut edges = Vec::new();
48 for (from, to, data) in data {
49 let edge = self.add_edge(*from, *to, data.clone());
50 edges.push(edge);
51 }
52 edges
53 }
54
55 fn add_nodes_and_edges(
56 &mut self,
57 data: Vec<(Self::NodeData, Vec<NodeID>)>,
58 ) -> (Vec<NodeID>, Vec<EdgeID>)
59 where
60 Self::EdgeData: Default + Clone,
61 Self::NodeData: Default + Clone,
62 {
63 let with_data: Vec<(Self::NodeData, Vec<(NodeID, Self::EdgeData)>)> = data
64 .iter()
65 .map(|(data, edges)| {
66 (
67 data.clone(),
68 edges
69 .iter()
70 .map(|id| (*id, Self::EdgeData::default()))
71 .collect(),
72 )
73 })
74 .collect();
75 self.add_nodes_and_edges_with_data(with_data)
76 }
77
78 fn add_nodes_and_edges_with_data(
79 &mut self,
80 node_data: Vec<(Self::NodeData, Vec<(NodeID, Self::EdgeData)>)>,
81 ) -> (Vec<NodeID>, Vec<EdgeID>)
82 where
83 Self::NodeData: Default + Clone,
84 Self::EdgeData: Clone,
85 {
86 let mut added_nodes = Vec::new();
87 let mut added_edges: Vec<EdgeID> = Vec::new();
88 for (data, connections) in node_data {
89 let node_id = {
90 let node = self.add_node(data);
91 added_nodes.push(node);
92 node
93 };
94 let edges: Vec<(NodeID, NodeID, Self::EdgeData)> = connections
95 .iter()
96 .map(|(to, edge_data)| (node_id, *to, edge_data.clone()))
97 .collect();
98 added_edges = self.add_edges_with_data(&edges);
99 }
100 (added_nodes, added_edges)
101 }
102}