use super::{Graph, IndexedEventRef};
use crate::id::PublicId;
use std::collections::BTreeSet;
pub(crate) struct Ancestors<'a, P: PublicId + 'a> {
pub(super) graph: &'a Graph<P>,
pub(super) queue: BTreeSet<IndexedEventRef<'a, P>>,
pub(super) visited: Vec<bool>, }
impl<'a, P: PublicId> Iterator for Ancestors<'a, P> {
type Item = IndexedEventRef<'a, P>;
fn next(&mut self) -> Option<Self::Item> {
loop {
let event = *self.queue.iter().rev().next()?;
let _ = self.queue.remove(&event);
if self.visited[event.topological_index()] {
continue;
}
self.visited[event.topological_index()] = true;
if let Some(parent) = event.self_parent().and_then(|index| self.graph.get(index)) {
let _ = self.queue.insert(parent);
}
if let Some(parent) = event.other_parent().and_then(|index| self.graph.get(index)) {
let _ = self.queue.insert(parent);
}
return Some(event);
}
}
}