pub struct ForestWalk<T> { /* private fields */ }
Expand description
Forest traversal
Implementations
sourceimpl<T> ForestWalk<T>
impl<T> ForestWalk<T>
sourcepub fn get(&self) -> Option<Visit<'_, T>>
pub fn get(&self) -> Option<Visit<'_, T>>
Returns the current node in the forest traversal, or None
if the traversal is completed.
Examples
use trees::{tr,Visit,ForestWalk};
let forest = -tr(1)-tr(2)-tr(3);
let walk = ForestWalk::from( forest );
assert_eq!( walk.get(), Some( Visit::Leaf( tr(1).root() )));
sourcepub fn forward(&mut self)
pub fn forward(&mut self)
Depth first search on ForestWalk
.
Preorder or postorder at will.
Examples
use trees::{tr,Visit,ForestWalk};
let forest = - ( tr(1)/tr(2)/tr(3) ) - ( tr(4)/tr(5)/tr(6) );
let mut walk = ForestWalk::from( forest );
assert_eq!( walk.get(), Some( Visit::Begin( (tr(1)/tr(2)/tr(3)).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(2).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(3).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::End ( (tr(1)/tr(2)/tr(3)).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Begin( (tr(4)/tr(5)/tr(6)).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(5).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(6).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::End ( (tr(4)/tr(5)/tr(6)).root() )));
walk.forward();
assert_eq!( walk.get(), None );
walk.forward();
assert_eq!( walk.get(), None );
walk.forward();
sourcepub fn next(&mut self) -> Option<Visit<'_, T>>
pub fn next(&mut self) -> Option<Visit<'_, T>>
Advance the cursor and return the newly visited node.
NOTICE: the FIRST node in the traversal can NOT be accessed via next() call.
Examples
use trees::{tr,Visit,ForestWalk};
let forest = -tr(1)-tr(2)-tr(3);
let mut walk = ForestWalk::from( forest );
assert_eq!( walk.next(), Some( Visit::Leaf( tr(2).root() )));
assert_eq!( walk.next(), Some( Visit::Leaf( tr(3).root() )));
assert_eq!( walk.next(), None );
assert_eq!( walk.next(), None );
sourcepub fn to_parent(&mut self) -> Option<Visit<'_, T>>
pub fn to_parent(&mut self) -> Option<Visit<'_, T>>
Set the cursor to the current node’s parent and returns it, or None
if it has no parent.
Examples
use trees::{tr,Visit,ForestWalk};
let forest = - ( tr(1)/tr(2)/tr(3) ) - ( tr(4)/tr(5)/tr(6) );
let mut walk = ForestWalk::from( forest );
assert_eq!( walk.get(), Some( Visit::Begin( (tr(1)/tr(2)/tr(3)).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(2).root() )));
assert_eq!( walk.to_parent(), Some( Visit::End( (tr(1)/tr(2)/tr(3)).root() )));
sourcepub fn get_parent(&self) -> Option<&Node<T>>
pub fn get_parent(&self) -> Option<&Node<T>>
Returns the parent of current node, or None
if it has no parent.
Examples
use trees::{tr,Visit,ForestWalk};
let forest = - ( tr(1)/tr(2)/tr(3) ) - ( tr(4)/tr(5)/tr(6) );
let mut walk = ForestWalk::from( forest );
assert_eq!( walk.get(), Some( Visit::Begin( (tr(1)/tr(2)/tr(3)).root() )));
assert_eq!( walk.get_parent(), None );
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(2).root() )));
assert_eq!( walk.get_parent(), Some( (tr(1)/tr(2)/tr(3)).root() ));
sourcepub fn to_child(&mut self, n: usize) -> Option<Visit<'_, T>>
pub fn to_child(&mut self, n: usize) -> Option<Visit<'_, T>>
Set the cursor to the current node’s n
-th child and returns it, or None
if it has no child.
Notice that n == 0
indicating the first child.
Examples
use trees::{tr,Visit,ForestWalk};
let forest = - ( tr(1)/tr(2)/tr(3) ) - ( tr(4)/tr(5)/tr(6) );
let mut walk = ForestWalk::from( forest );
assert_eq!( walk.get(), Some( Visit::Begin( (tr(1)/tr(2)/tr(3)).root() )));
walk.to_child( 1 );
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(3).root() )));
sourcepub fn to_sib(&mut self, n: usize) -> Option<Visit<'_, T>>
pub fn to_sib(&mut self, n: usize) -> Option<Visit<'_, T>>
Set the cursor to the current node’s next n
-th sibling and returns it, or None
if such sibling does not exist.
Returns the current node if n == 0.
Examples
use trees::{tr,Visit,ForestWalk};
let forest = -tr(1)-tr(2)-tr(3);
let mut walk = ForestWalk::from( forest );
assert_eq!( walk.get(), Some( Visit::Leaf( tr(1).root() )));
assert_eq!( walk.to_sib( 0 ), Some( Visit::Leaf( tr(1).root() )));
assert_eq!( walk.to_sib( 2 ), Some( Visit::Leaf( tr(3).root() )));
sourcepub fn revisit(&mut self)
pub fn revisit(&mut self)
Revisit a Node
that reached Visit::End
.
No effect on Visit::Begin
or Visit::Leaf
.
Examples
use trees::{tr,Visit,ForestWalk};
let forest = - ( tr(1)/tr(2)/tr(3) ) - ( tr(4)/tr(5)/tr(6) );
let mut walk = ForestWalk::from( forest );
for _ in 0..3 {
walk.revisit();
assert_eq!( walk.get(), Some( Visit::Begin( (tr(1)/tr(2)/tr(3)).root() )));
for _ in 0..3 {
walk.revisit();
assert_eq!( walk.get(), Some( Visit::Begin( (tr(1)/tr(2)/tr(3)).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(2).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(3).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::End ( (tr(1)/tr(2)/tr(3)).root() )));
}
walk.forward();
for _ in 0..3 {
walk.revisit();
assert_eq!( walk.get(), Some( Visit::Begin( (tr(4)/tr(5)/tr(6)).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(5).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::Leaf ( tr(6).root() )));
walk.forward();
assert_eq!( walk.get(), Some( Visit::End ( (tr(4)/tr(5)/tr(6)).root() )));
}
walk.forward();
}