use core::iter::FusedIterator;
use crate::flavor::Flavor;
use crate::links::Links;
use crate::node::Node;
use crate::node::{Event, SkipTokens, WalkEvents};
pub struct Walk<'a, T, F>
where
T: Copy,
F: Flavor,
{
iter: WalkEvents<'a, T, F>,
}
impl<'a, T, F> Walk<'a, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
pub(crate) fn new(
tree: &'a [Links<T, F::Index, F::Pointer>],
node: Option<F::Pointer>,
e: Event,
) -> Self {
Self {
iter: WalkEvents::new(tree, node, e),
}
}
#[inline]
#[must_use]
pub fn inside(self) -> Inside<'a, T, F> {
Inside { iter: self.iter }
}
#[inline]
#[must_use]
pub fn with_depths(self) -> WithDepths<'a, T, F> {
WithDepths { iter: self.iter }
}
#[inline]
#[must_use]
pub fn skip_tokens(self) -> SkipTokens<Self> {
SkipTokens::new(self)
}
#[inline]
#[must_use]
pub fn next_with_depth(&mut self) -> Option<(isize, Node<'a, T, F>)> {
loop {
let depth = self.iter.depth();
let (event, node) = self.iter.next()?;
if !matches!(event, Event::Up) {
return Some((depth, node));
}
}
}
}
impl<T, F> Clone for Walk<'_, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
fn clone(&self) -> Self {
Self {
iter: self.iter.clone(),
}
}
}
impl<T, F> Default for Walk<'_, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
fn default() -> Self {
Self {
iter: WalkEvents::default(),
}
}
}
impl<'a, T, F> Iterator for Walk<'a, T, F>
where
T: Copy,
F: Flavor,
{
type Item = Node<'a, T, F>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
loop {
let (event, node) = self.iter.next()?;
if !matches!(event, Event::Up) {
return Some(node);
}
}
}
}
impl<T, F> FusedIterator for Walk<'_, T, F>
where
T: Copy,
F: Flavor,
{
}
pub struct WithDepths<'a, T, F>
where
T: Copy,
F: Flavor,
{
iter: WalkEvents<'a, T, F>,
}
impl<'a, T, F> Iterator for WithDepths<'a, T, F>
where
T: Copy,
F: Flavor,
{
type Item = (isize, Node<'a, T, F>);
#[inline]
fn next(&mut self) -> Option<Self::Item> {
loop {
let depth = self.iter.depth();
let (event, node) = self.iter.next()?;
if !matches!(event, Event::Up) {
return Some((depth, node));
}
}
}
}
impl<T, F> FusedIterator for WithDepths<'_, T, F>
where
T: Copy,
F: Flavor,
{
}
impl<T, F> Clone for WithDepths<'_, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
fn clone(&self) -> Self {
Self {
iter: self.iter.clone(),
}
}
}
impl<T, F> Default for WithDepths<'_, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
fn default() -> Self {
Self {
iter: WalkEvents::default(),
}
}
}
pub struct Inside<'a, T, F>
where
T: Copy,
F: Flavor,
{
iter: WalkEvents<'a, T, F>,
}
impl<'a, T, F> Iterator for Inside<'a, T, F>
where
T: Copy,
F: Flavor,
{
type Item = Node<'a, T, F>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
loop {
let (event, node) = self.iter.next()?;
if self.iter.depth() <= 0 {
self.iter = WalkEvents::default();
}
if !matches!(event, Event::Up) {
return Some(node);
}
}
}
}
impl<T, F> FusedIterator for Inside<'_, T, F>
where
T: Copy,
F: Flavor,
{
}
impl<T, F> Clone for Inside<'_, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
fn clone(&self) -> Self {
Self {
iter: self.iter.clone(),
}
}
}
impl<T, F> Default for Inside<'_, T, F>
where
T: Copy,
F: Flavor,
{
#[inline]
fn default() -> Self {
Self {
iter: WalkEvents::default(),
}
}
}