iter_tree/tree_deque/
into_tree_deque.rs

1use 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}