use core::iter::FusedIterator;
use crate::flavor::Flavor;
use crate::links::Links;
use crate::node::{Node, SkipTokens};
use crate::pointer::Pointer;
pub struct Children<'a, T, F>
where
T: Copy,
F: Flavor,
{
tree: &'a [Links<T, F::Index, F::Pointer>],
first: Option<F::Pointer>,
last: Option<F::Pointer>,
}
impl<'a, T, F> Children<'a, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
pub(crate) const fn new(
tree: &'a [Links<T, F::Index, F::Pointer>],
first: Option<F::Pointer>,
last: Option<F::Pointer>,
) -> Self {
Self { tree, first, last }
}
#[must_use]
pub const fn skip_tokens(self) -> SkipTokens<Self> {
SkipTokens::new(self)
}
#[inline]
pub fn next_node(&mut self) -> Option<Node<'a, T, F>> {
self.find(|n| n.has_children())
}
}
impl<'a, T, F> Iterator for Children<'a, T, F>
where
T: Copy,
F: Flavor,
{
type Item = Node<'a, T, F>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
let first = self.first.take()?;
let node = self.tree.get(first.get())?;
if first != self.last? {
self.first = node.next;
}
Some(Node::new(node, self.tree))
}
}
impl<T, F> DoubleEndedIterator for Children<'_, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
let last = self.last.take()?;
let node = self.tree.get(last.get())?;
if last != self.first? {
self.last = node.prev;
}
Some(Node::new(node, self.tree))
}
}
impl<T, F> FusedIterator for Children<'_, T, F>
where
T: Copy,
F: Flavor,
{
}
impl<T, F> Clone for Children<'_, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
fn clone(&self) -> Self {
Self {
tree: self.tree,
first: self.first,
last: self.last,
}
}
}
impl<T, F> Default for Children<'_, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
fn default() -> Self {
Self {
tree: &[],
first: None,
last: None,
}
}
}