This library provide an easy way to transform iterators into trees. This can be useful when building simple parsers to convert a stream of token into a tree of token.
It provide two types of tree:
The default one, Tree
is based on Vec
from the standard library.
The second one is based on VecDeque
from the standard libray. To get this one, you have to activate the deque
feature flag.
The goals for the future of this crate includes but are not limited to :
tree_map
and tree_deque_map
method that would map the item before including it in the Tree.The creation of a tree is controlled with the BranchControl
enum.
This enum has three variants :
Note:
When filling a branch started with
BranchControl::Start
, no crash or error will happens if the iterator ends before encountering the correspondingBranchControl::End
. Similarly, any unmatchedBranchControl::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 tree = "a+(b+c)+d"
.chars()
.into_iter()
.tree(|&item: &char| match item {
'(' => {
depth += 1;
BranchControl::Start
}
')' => {
depth -= 1;
BranchControl::End
}
_ => BranchControl::Continue,
})
.collect::
println!("{tree:?}");
assert_eq!(0, depth); ```
bash
Branch(
[
Leaf(
'a',
),
Leaf(
'+',
),
Branch(
[
Leaf(
'(',
),
Leaf(
'b',
),
Leaf(
'+',
),
Leaf(
'c',
),
Leaf(
')',
),
],
),
Leaf(
'+',
),
Leaf(
'd',
),
],
)
Additionally 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()) ```