Skip to main content

v_hist/
lib.rs

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}