use crate::graph::{EdgesFrom, EdgesTo, Graph, Node, NodeId};
#[derive(Clone, Debug)]
pub struct NodeRef<'a, NodeData: Clone, EdgeData: Clone> {
graph: &'a Graph<NodeData, EdgeData>,
index: NodeId,
}
impl<'a, NodeData: Clone, EdgeData: Clone> Copy for NodeRef<'a, NodeData, EdgeData> {}
impl<'a, NodeData: Clone, EdgeData: Clone> NodeRef<'a, NodeData, EdgeData> {
#[must_use]
pub(crate) fn new(graph: &'a Graph<NodeData, EdgeData>, index: NodeId) -> Self {
Self { graph, index }
}
#[must_use]
fn node(&self) -> &'a Node<NodeData> {
self.graph
.nodes
.get(self.index.0)
.expect("invariant violation: NodeRef points to invalid node")
}
#[must_use]
pub fn data(&self) -> &'a NodeData {
&self.node().data
}
#[must_use]
pub fn id(&self) -> NodeId {
self.index
}
pub fn iter_edges_from(&self) -> EdgesFrom<'a, NodeData, EdgeData> {
EdgesFrom::new(self.graph, self.node().first_edge_from)
}
pub fn iter_edges_to(&self) -> EdgesTo<'a, NodeData, EdgeData> {
EdgesTo::new(self.graph, self.node().first_edge_to)
}
}