use crate::graph::{Edge, EdgeId, Graph, NodeMut, NodeRef};
#[derive(Debug)]
pub struct EdgeMut<'a, NodeData: Clone, EdgeData: Clone> {
graph: &'a mut Graph<NodeData, EdgeData>,
index: EdgeId,
}
impl<'a, NodeData: Clone, EdgeData: Clone> EdgeMut<'a, NodeData, EdgeData> {
#[must_use]
pub(crate) fn new(graph: &'a mut Graph<NodeData, EdgeData>, index: EdgeId) -> Self {
Self { graph, index }
}
#[must_use]
fn edge(&self) -> &Edge<EdgeData> {
self.graph
.edges
.get(self.index.0)
.expect("invariant violation: EdgeMut points to invalid edge")
}
#[must_use]
fn edge_mut(&mut self) -> &mut Edge<EdgeData> {
self.graph
.edges
.get_mut(self.index.0)
.expect("invariant violation: EdgeMut points to invalid edge")
}
#[must_use]
pub fn data(&self) -> &EdgeData {
&self.edge().data
}
#[must_use]
pub fn data_mut(&mut self) -> &mut EdgeData {
&mut self.edge_mut().data
}
#[must_use]
pub fn id(&self) -> EdgeId {
self.index
}
#[must_use]
pub fn get_from_node(&self) -> NodeRef<NodeData, EdgeData> {
NodeRef::new(self.graph, self.edge().from)
}
#[must_use]
pub fn get_from_node_mut(&mut self) -> NodeMut<NodeData, EdgeData> {
NodeMut::new(self.graph, self.edge().from)
}
#[must_use]
pub fn get_to_node(&self) -> NodeRef<NodeData, EdgeData> {
NodeRef::new(self.graph, self.edge().to)
}
#[must_use]
pub fn get_to_node_mut(&mut self) -> NodeMut<NodeData, EdgeData> {
NodeMut::new(self.graph, self.edge().to)
}
#[allow(clippy::must_use_candidate)]
pub fn remove(self) -> EdgeData {
let removed = self
.graph
.edges
.remove(self.index.0)
.expect("invariant violation: EdgeMut points to invalid edge");
self.graph.detach_edge_from_from_list(&removed);
self.graph.detach_edge_from_to_list(&removed);
removed.data
}
}