1use crate::graph::{Edge, EdgeId, Graph, NodeMut, NodeRef};
4
5#[derive(Debug)]
9pub struct EdgeMut<'a, NodeData: Clone, EdgeData: Clone> {
10 graph: &'a mut Graph<NodeData, EdgeData>,
11 index: EdgeId,
12}
13
14impl<'a, NodeData: Clone, EdgeData: Clone> EdgeMut<'a, NodeData, EdgeData> {
15 #[must_use]
16 pub(crate) fn new(graph: &'a mut Graph<NodeData, EdgeData>, index: EdgeId) -> Self {
17 Self { graph, index }
18 }
19
20 #[must_use]
24 fn edge(&self) -> &Edge<EdgeData> {
25 self.graph
26 .edges
27 .get(self.index.0)
28 .expect("invariant violation: EdgeMut points to invalid edge")
29 }
30
31 #[must_use]
35 fn edge_mut(&mut self) -> &mut Edge<EdgeData> {
36 self.graph
37 .edges
38 .get_mut(self.index.0)
39 .expect("invariant violation: EdgeMut points to invalid edge")
40 }
41
42 #[must_use]
46 pub fn data(&self) -> &EdgeData {
47 &self.edge().data
48 }
49
50 #[must_use]
54 pub fn data_mut(&mut self) -> &mut EdgeData {
55 &mut self.edge_mut().data
56 }
57
58 #[must_use]
62 pub fn id(&self) -> EdgeId {
63 self.index
64 }
65
66 #[must_use]
70 pub fn get_from_node(&self) -> NodeRef<NodeData, EdgeData> {
71 NodeRef::new(self.graph, self.edge().from)
72 }
73
74 #[must_use]
78 pub fn get_from_node_mut(&mut self) -> NodeMut<NodeData, EdgeData> {
79 NodeMut::new(self.graph, self.edge().from)
80 }
81
82 #[must_use]
86 pub fn get_to_node(&self) -> NodeRef<NodeData, EdgeData> {
87 NodeRef::new(self.graph, self.edge().to)
88 }
89
90 #[must_use]
94 pub fn get_to_node_mut(&mut self) -> NodeMut<NodeData, EdgeData> {
95 NodeMut::new(self.graph, self.edge().to)
96 }
97
98 #[allow(clippy::must_use_candidate)]
104 pub fn remove(self) -> EdgeData {
105 let removed = self
106 .graph
107 .edges
108 .remove(self.index.0)
109 .expect("invariant violation: EdgeMut points to invalid edge");
110
111 self.graph.detach_edge_from_from_list(&removed);
112 self.graph.detach_edge_from_to_list(&removed);
113
114 removed.data
115 }
116}