This library provides an easy way to convert between iterators and tree structures in both directions. This can be useful when building simple parsers to convert a stream of token into a tree of token.
It extends iterators with two functions :
tree
that maps the iterator to an iterator of Tree that can be collected to a Tree
.
tree_deque
that maps the iterator to an iterator of TreeDeque
that can be collected to a TreeDeque
.
To get this one, you have to activate the deque
feature flag.
Both type of trees implement the IntoIterator
trait.
The creation of a tree is controlled with the BranchControl
enum.
This enum has three variants :
BranchControl::Start
BranchControl::Continue
BranchControl::End
Note:
When filling a branch started with BranchControl::Start
, no crash or error will happens if the iterator ends before encountering the corresponding BranchControl::End
.
Similarly, any unmatched BranchControl::End
will simply be ignored.
If you want to check for these kind of situations, you can use a trick such as the depth counter showed in the below example.
```rust use iter_tree::prelude::*;
let mut depth = 0;
let before = String::from("a+(b+c)+d");
let tree: Tree
println!("{tree:#?}");
let after: String = tree.into_iter().collect();
assert_eq!(before, after); ```
bash
Branch(
[
Leaf(
'a',
),
Leaf(
'+',
),
Branch(
[
Leaf(
'(',
),
Leaf(
'b',
),
Leaf(
'+',
),
Leaf(
'c',
),
Leaf(
')',
),
],
),
Leaf(
'+',
),
Leaf(
'd',
),
],
)
Controller
sAdditionally you can create a struct that implements the Controller
trait to replace the closure from the previous example.
Here is an example of how this can be applied :
```rust use iter_tree::prelude::*;
struct StackController
impl
impl Controller
let mut controller = StackController::default();
let _1 = "< ( < > ) >"
.chars()
.tree(&mut controller)
.collect::
assert!(controller.is_empty());
let mut controller = StackController::default();
let _b = "<(>)".chars().tree(&mut controller).collect::
assert!(!controller.is_empty()) ```
The goals for the future of this crate includes but are not limited to :
Adding more methods to build Trees such as for example a tree_map
and tree_deque_map
method that would map the item before including it in the Tree.
Providing other types of Trees, notably some that separate the item that inited and terminated a branch.