1use crate::aim::Writer;
2
3pub struct TreeWriter {
4 level_length: [u16; 4],
5 is_complete: u8,
6}
7
8impl TreeWriter {
10
11 pub fn new() -> Self {
12 Self {
13 level_length: [
14 0,
15 0,
16 0,
17 0
18 ],
19 is_complete: 0,
20 }
21 }
22
23 pub fn one(&mut self, one: usize) {
24 self.level_length[0] = one as u16;
25 self.level_length[1] = 0;
26 self.level_length[2] = 0;
27 self.level_length[3] = 0;
28 self.is_complete = 0;
29 }
30
31 pub fn two(&mut self, one: usize, two: usize) {
32 self.level_length[0] = one as u16;
33 self.level_length[1] = two as u16;
34 self.level_length[2] = 0;
35 self.level_length[3] = 0;
36 self.is_complete = 0;
37 }
38
39 pub fn three(&mut self, one: usize, two: usize, three: usize) {
40 self.level_length[0] = one as u16;
41 self.level_length[1] = two as u16;
42 self.level_length[2] = three as u16;
43 self.level_length[3] = 0;
44 self.is_complete = 0;
45 }
46
47 pub fn four(&mut self, one: usize, two: usize, three: usize, four: usize) {
48 self.level_length[0] = one as u16;
49 self.level_length[1] = two as u16;
50 self.level_length[2] = three as u16;
51 self.level_length[3] = four as u16;
52 self.is_complete = 0;
53 }
54
55 pub fn print(&mut self, index: usize, level: usize, writer: &mut Writer) {
56 const RUNNING: &'static str = "│ ";
57 const COMPLETE: &'static str = " ";
58 const NEXT: &'static str = "├─";
59 const LAST: &'static str = "└─";
60 assert!(level < 4);
61 for l in 0..level {
62 if 0 == (self.is_complete & 1 << l) {
63 writer.write_str(RUNNING);
64 } else {
65 writer.write_str(COMPLETE);
66 }
67 }
68 if index + 1 == self.level_length[level] as usize {
69 writer.write_str(LAST);
70 self.is_complete |= 1 << level
71 } else {
72 writer.write_str(NEXT);
73 }
74 }
75
76 pub fn to_sting(&mut self, index: usize, level: usize) -> String {
77 let mut writer = Writer::stringizer();
78 self.print(index, level, &mut writer);
79 writer.finish()
80 }
81}