display_node/implementations/
bin_tree.rs

1use std::{fmt::Display, mem::swap};
2
3use crate::DisplayableNode;
4
5pub struct BinaryTree<D> {
6    data: D,
7    children: [Option<Box<BinaryTree<D>>>; 2],
8}
9#[macro_export]
10macro_rules! bt {
11    (
12 $value:expr,
13 $left:expr,
14 $right:expr
15 ) => {{
16        BinaryTree::assemble(($value), Some($left), Some($right))
17    }};
18
19    (
20 $value:expr,
21 ,
22 $right:expr
23 ) => {{
24        BinaryTree::assemble(($value), None, Some($right))
25    }};
26
27    (
28 $value:expr,
29 $left:expr,
30
31 ) => {{
32        BinaryTree::assemble(($value), Some($left), None)
33    }};
34
35    (
36 $value:expr
37 ) => {{
38        BinaryTree::new(($value))
39    }};
40}
41
42impl<D> BinaryTree<D> {
43    pub fn new(data: D) -> Self {
44        Self {
45            data,
46            children: [None, None],
47        }
48    }
49
50    pub fn assemble(data: D, x: Option<BinaryTree<D>>, y: Option<BinaryTree<D>>) -> Self {
51        let x = x.map(|x| Box::new(x));
52        let y = y.map(|y| Box::new(y));
53        Self {
54            data,
55            children: [x, y],
56        }
57    }
58
59    pub fn children(&self) -> (Option<&BinaryTree<D>>, Option<&BinaryTree<D>>) {
60        let [x, y] = &self.children;
61        let x = x.as_ref().map(|boxed_x| boxed_x.as_ref());
62        let y = y.as_ref().map(|boxed_y| boxed_y.as_ref());
63        (x, y)
64    }
65
66    pub fn x_ref(&self) -> Option<&BinaryTree<D>> {
67        self.children[0].as_ref().map(|boxed| boxed.as_ref())
68    }
69
70    pub fn y_ref(&self) -> Option<&BinaryTree<D>> {
71        self.children[1].as_ref().map(|boxed| boxed.as_ref())
72    }
73
74    pub fn x_mut(&mut self) -> Option<&mut BinaryTree<D>> {
75        self.children[0].as_mut().map(|boxed| boxed.as_mut())
76    }
77
78    pub fn y_mut(&mut self) -> Option<&mut BinaryTree<D>> {
79        self.children[1].as_mut().map(|boxed| boxed.as_mut())
80    }
81
82    pub fn set_x(&mut self, x: BinaryTree<D>) -> Option<BinaryTree<D>> {
83        let mut outer = Some(Box::new(x));
84        let outer_ref = &mut outer;
85        let inner_ref = &mut self.children[0];
86        swap(outer_ref, inner_ref);
87        outer.map(|boxed| *boxed)
88    }
89
90    pub fn set_y(&mut self, y: BinaryTree<D>) -> Option<BinaryTree<D>> {
91        let mut outer = Some(Box::new(y));
92        let outer_ref = &mut outer;
93        let inner_ref = &mut self.children[1];
94        swap(outer_ref, inner_ref);
95        outer.map(|boxed| *boxed)
96    }
97
98    pub fn data(&self) -> &D {
99        &self.data
100    }
101
102    pub fn data_put(&mut self) -> &mut D {
103        &mut self.data
104    }
105}
106
107impl<D: Display> DisplayableNode for BinaryTree<D> {
108    fn label(&self) -> Option<String> {
109        let data = self.data();
110        Some(format!("{data}"))
111    }
112
113    fn children(&self) -> Vec<&Self> {
114        match self.children() {
115            (Some(left), Some(right)) => vec![left, right],
116            (Some(left), None) => vec![left],
117            (None, Some(right)) => vec![right],
118            (None, None) => vec![],
119        }
120    }
121}
122
123#[test]
124fn it_works() {
125    let tree = bt!(
126        1,
127        bt!(
128            2,
129            ,
130            bt!(5)
131        ),
132        bt!(3, bt!(4, bt!(7),), bt!(6))
133    );
134
135    println!("{}", tree.display());
136}