use crate::{
algorithm::search::{EdgeTraversal, SearchTree, SearchTreeError},
model::{
label::Label,
network::{Edge, Vertex},
},
};
pub struct EdgeTraversalContext<'a> {
pub parent_label: &'a Label,
pub src: &'a Vertex,
pub edge: &'a Edge,
pub dst: &'a Vertex,
pub tree: &'a SearchTree,
}
impl<'a> EdgeTraversalContext<'a> {
pub fn new(
parent_label: &'a Label,
src: &'a Vertex,
edge: &'a Edge,
dst: &'a Vertex,
tree: &'a SearchTree,
) -> Self {
Self {
parent_label,
src,
edge,
dst,
tree,
}
}
pub fn backtrack(&self, depth: Option<u64>) -> Result<Vec<EdgeTraversal>, SearchTreeError> {
self.tree.reconstruct_path(self.parent_label, depth)
}
pub fn previous_edge_traversal(&self) -> Result<Option<&EdgeTraversal>, SearchTreeError> {
if self.tree.is_empty() {
return Ok(None);
}
let pred = self.tree.predecessor(self.parent_label)?;
match pred {
Some((edge_traversal, _)) => Ok(Some(edge_traversal)),
None => Ok(None),
}
}
}