iter_tree/tree_deque/
into_tree_deque.rs1use std::collections::VecDeque;
2
3use super::TreeDeque;
4use crate::{Nesting, NestingFunction};
5
6pub trait IntoTreeDequeExt<Token> {
7 fn into_tree_deque<F>(self, fun: F) -> TreeDeque<Token>
8 where
9 F: NestingFunction<Token>;
10}
11
12impl<Iterable, Token> IntoTreeDequeExt<Token> for Iterable
13where
14 Iterable: IntoIterator<Item = Token>,
15{
16 fn into_tree_deque<F>(self, mut fun: F) -> TreeDeque<Token>
17 where
18 F: NestingFunction<Token>,
19 {
20 let mut container = VecDeque::new();
21 let mut parents = Vec::new();
22
23 for token in self {
24 match fun.direction(&token) {
25 Nesting::Increase => {
26 let mut parent = VecDeque::new();
27 core::mem::swap(&mut parent, &mut container);
28 parents.push(parent);
29 container.push_back(TreeDeque::Leaf(token));
30 }
31
32 Nesting::Maintain => container.push_back(TreeDeque::Leaf(token)),
33 Nesting::Decrease => {
34 let mut parent = parents.pop().unwrap_or(VecDeque::new());
35 container.push_back(TreeDeque::Leaf(token));
36 parent.push_back(TreeDeque::Node(container));
37 container = parent;
38 }
39 }
40 }
41
42 while let Some(mut parent) = parents.pop() {
43 parent.push_back(TreeDeque::Node(container));
44 container = parent;
45 }
46
47 TreeDeque::Node(container)
48 }
49}