fast_graph/
interface.rs

1//! # Contains [GraphInterface]
2//! GraphInterface is a trait for basic "read and write" operations on a graph; core operations needed to change a graph and some derived helper functions.
3
4use crate::{Edge, EdgeID, GraphError, Node, NodeID};
5
6/// GraphInterface is a trait for basic "read and write" operations on a graph; core operations needed to change a graph and some derived helper functions.
7pub 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}