1extern crate plotlib;
2
3use std::io::{self, BufRead};
4
5pub struct HistogramConfig {
6 pub nbins: u32,
7}
8
9fn get_single_column() -> Vec<f64> {
13 let stdin = io::stdin();
14 let mut data: Vec<f64> = vec![];
15 for line in stdin.lock().lines() {
16 let line_text = match line {
17 Ok(line) => line,
18 Err(err) => panic!("IO error: {}", err),
19 };
20 data.push(line_text.parse::<f64>()
21 .expect(&format!("ERROR: Could not parse '{}' as an f64", line_text)));
22 }
23 data
24}
25
26fn get_two_columns() -> Vec<(f64, f64)> {
27 let stdin = io::stdin();
28 let mut data: Vec<(f64, f64)> = vec![];
29 for line in stdin.lock().lines() {
30 let line_text = match line {
31 Ok(line) => line,
32 Err(err) => panic!("IO error: {}", err),
33 };
34 let nums: Vec<_> = line_text.split_whitespace().collect();
35 if nums.len() != 2 {
36 panic!("Wrong number of args on line");
37 }
38 let a = nums[0];
39 let b = nums[1];
40
41 let a = a.parse::<f64>()
42 .expect(&format!("ERROR: Could not parse '{}' as an f64", a));
43 let b = b.parse::<f64>()
44 .expect(&format!("ERROR: Could not parse '{}' as an f64", b));
45
46 data.push((a, b));
47 }
48 data
49}
50
51pub fn hist(config: HistogramConfig) {
52 let data = get_single_column();
53
54 let h = plotlib::histogram::Histogram::from_vec(&data, config.nbins);
55
56 plotlib::text_render::draw_histogram(&h);
57}
58
59pub fn scatter() {
60 let data = get_two_columns();
61
62 let h = plotlib::scatter::Scatter::from_vec(&data);
63
64 plotlib::text_render::draw_scatter(&h);
65}
66
67pub fn average() {
68 let stdin = io::stdin();
69 let mut total = 0.0;
70 let mut length = 0;
71 for line in stdin.lock().lines() {
72 let line_text = match line {
73 Ok(line) => line,
74 Err(err) => panic!("IO error: {}", err),
75 };
76 length += 1;
77 total += line_text.parse::<f64>()
78 .expect(&format!("ERROR: Could not parse '{}' as an f64", line_text));
79 }
80
81 println!("{}", total / length as f64);
82}
83
84pub fn stats() {
85 let data = get_single_column();
86
87 let max = data.iter().fold(-1. / 0., |a, &b| f64::max(a, b));
88 let min = data.iter().fold(1. / 0., |a, &b| f64::min(a, b));
89 let total: f64 = data.iter().sum();
90 let average = total / data.len() as f64;
91 let length = data.len();
92
93 println!(" Max: {}", max);
94 println!(" Min: {}", min);
95 println!("Average: {}", average);
96 println!(" Length: {}", length);
97}