use super::node::*;
use nalgebra::RealField;
use simba::scalar::SubsetOf;
use std::collections::VecDeque;
#[derive(Debug)]
pub struct Ancestors<T>
where
T: RealField,
{
parent: Option<Node<T>>,
}
impl<T> Ancestors<T>
where
T: RealField,
{
pub fn new(parent: Option<Node<T>>) -> Self {
Self { parent }
}
}
impl<T> Iterator for Ancestors<T>
where
T: RealField + SubsetOf<f64>,
{
type Item = Node<T>;
#[allow(clippy::question_mark)]
fn next(&mut self) -> Option<Node<T>> {
if self.parent.is_none() {
return None;
}
let next = self.parent.clone().unwrap();
self.parent = next.parent();
Some(next)
}
}
#[derive(Debug)]
pub struct Descendants<T>
where
T: RealField,
{
queue: VecDeque<Node<T>>,
}
impl<T> Descendants<T>
where
T: RealField,
{
pub fn new(queue: Vec<Node<T>>) -> Self {
Self {
queue: queue.into(),
}
}
}
impl<T> Iterator for Descendants<T>
where
T: RealField + SubsetOf<f64>,
{
type Item = Node<T>;
fn next(&mut self) -> Option<Self::Item> {
let node = match self.queue.pop_front() {
Some(node) => node,
None => {
return None;
}
};
let mut new_queue: VecDeque<Node<T>> = node.children().clone().into();
new_queue.append(&mut (self.queue.clone()));
self.queue = new_queue;
Some(node)
}
}