use crate::graph::{EdgesFrom, EdgesTo, Graph, Node, NodeId};
#[derive(Debug)]
pub struct NodeMut<'a, NodeData: Clone, EdgeData: Clone> {
pub(crate) graph: &'a mut Graph<NodeData, EdgeData>,
pub(crate) index: NodeId,
}
impl<'a, NodeData: Clone, EdgeData: Clone> NodeMut<'a, NodeData, EdgeData> {
#[must_use]
pub(crate) fn new(graph: &'a mut Graph<NodeData, EdgeData>, index: NodeId) -> Self {
Self { graph, index }
}
#[must_use]
fn node(&self) -> &Node<NodeData> {
self.graph
.nodes
.get(self.index.0)
.expect("invariant violation: NodeMut points to invalid node")
}
#[must_use]
fn node_mut(&mut self) -> &mut Node<NodeData> {
self.graph
.nodes
.get_mut(self.index.0)
.expect("invariant violation: NodeMut points to invalid node")
}
#[must_use]
pub fn data(&self) -> &NodeData {
&self.node().data
}
#[must_use]
pub fn data_mut(&mut self) -> &mut NodeData {
&mut self.node_mut().data
}
#[must_use]
pub fn id(&self) -> NodeId {
self.index
}
pub fn iter_edges_from(&self) -> EdgesFrom<NodeData, EdgeData> {
EdgesFrom::new(self.graph, self.node().first_edge_from)
}
pub fn iter_edges_to(&self) -> EdgesTo<NodeData, EdgeData> {
EdgesTo::new(self.graph, self.node().first_edge_to)
}
#[allow(clippy::must_use_candidate)]
pub fn remove(self) -> NodeData {
let removed = self
.graph
.nodes
.remove(self.index.0)
.expect("invariant violation: NodeMut points to invalid node");
self.graph.remove_all_edges_connecting(self.index, &removed);
removed.data
}
}