use core::iter::FusedIterator;
use oxgraph_topology::{
ContainsElement, ElementId, ElementIndex, ElementPredecessors, ElementSuccessors,
};
use crate::bfs::{
BfsError,
core::{Bfs, Forward, Reverse, SeededOwnedFrontier, ValidatedStart},
};
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct BreadthFirstSearch<'graph, G>
where
G: ContainsElement + ElementSuccessors + ElementIndex,
{
inner: Bfs<'graph, G, SeededOwnedFrontier<G>, Forward>,
}
impl<G> Iterator for BreadthFirstSearch<'_, G>
where
G: ContainsElement + ElementSuccessors + ElementIndex,
{
type Item = ElementId<G>;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
}
impl<G> FusedIterator for BreadthFirstSearch<'_, G> where
G: ContainsElement + ElementSuccessors + ElementIndex
{
}
pub fn breadth_first_search<G>(
graph: &G,
start: ElementId<G>,
) -> Result<BreadthFirstSearch<'_, G>, BfsError>
where
G: ContainsElement + ElementSuccessors + ElementIndex,
{
let witness = ValidatedStart::new(graph, start)?;
let frontier = SeededOwnedFrontier::new(start, witness);
Ok(BreadthFirstSearch {
inner: Bfs::new(graph, frontier),
})
}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct ReverseBreadthFirstSearch<'graph, G>
where
G: ContainsElement + ElementPredecessors + ElementIndex,
{
inner: Bfs<'graph, G, SeededOwnedFrontier<G>, Reverse>,
}
impl<G> Iterator for ReverseBreadthFirstSearch<'_, G>
where
G: ContainsElement + ElementPredecessors + ElementIndex,
{
type Item = ElementId<G>;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
}
impl<G> FusedIterator for ReverseBreadthFirstSearch<'_, G> where
G: ContainsElement + ElementPredecessors + ElementIndex
{
}
pub fn reverse_breadth_first_search<G>(
graph: &G,
start: ElementId<G>,
) -> Result<ReverseBreadthFirstSearch<'_, G>, BfsError>
where
G: ContainsElement + ElementPredecessors + ElementIndex,
{
let witness = ValidatedStart::new(graph, start)?;
let frontier = SeededOwnedFrontier::new(start, witness);
Ok(ReverseBreadthFirstSearch {
inner: Bfs::new(graph, frontier),
})
}