1pub struct Histogram {
2 num_entries: usize,
3 labels: Vec<String>,
4 label_len: usize,
5 values: Vec<usize>,
6 pub max_width: usize,
7}
8
9pub fn init() -> Histogram {
10 return Histogram {
11 num_entries: 0,
12 label_len: 1,
13 values: Vec::new(),
14 labels: Vec::new(),
15 max_width: 0,
16 };
17}
18
19impl Histogram {
20 pub fn add_entry(&mut self, label: String, value: usize) {
21 if label.len() > self.label_len {
22 self.label_len = label.len();
23 }
24
25 self.values.push(value);
26 self.labels.push(label);
27 self.num_entries += 1;
28 }
29
30 pub fn draw(&self) {
31 let max = self.values.iter().max().unwrap();
32 let width = if self.max_width > 0 {
33 self.max_width
34 } else {
35 console::Term::stdout().size().1 as usize - (self.label_len + 2)
36 };
37 let dw = max / width;
38
39 for x in 0..self.num_entries {
40 println!();
41 let s = format!(
42 "{label:>width$}",
43 label = self.labels[x],
44 width = self.label_len
45 );
46 print!("{0}{1}", s, "|");
47
48 for y in 0..width {
49 if self.values[x] > dw * y {
50 print!("#");
51 } else {
52 break;
53 }
54 }
55 }
56
57 println!();
58 }
59}
60
61pub fn draw_from_array(arr: Vec<usize>, size: usize) {
62 let max = arr.iter().max().unwrap();
63 let num_digits = ((size as f32).log10() + 1.0).floor() as usize;
64 let width = console::Term::stdout().size().1 as usize - (num_digits + 2);
65 let dw = max / width;
66
67 for x in 0..size {
68 let s: String = format!("{:0width$}", x, width = num_digits);
69 println!();
70 println!("{0}{1}", s, "|");
71
72 for y in 0..(width - num_digits + 2) {
73 if arr[x as usize] > dw * y {
74 print!("#");
75 } else {
76 break;
77 }
78 }
79 }
80
81 println!();
82}
83
84#[cfg(test)]
85mod tests {
86 #[test]
87 fn it_works() {
88 assert_eq!(2 + 2, 4);
89 }
90}