pub fn median(mut list: Vec<u64>) -> Option<f64> {
if list.is_empty() {
return None;
}
list.sort_unstable();
let mid_index = list.len() / 2;
let median = if list.len().is_multiple_of(2) {
(*list.get(mid_index - 1).expect("Cannot fail") + *list.get(mid_index).expect("Cannot fail")) as f64 / 2.0
} else {
*list.get(mid_index).expect("Cannot fail") as f64
};
Some(median)
}
pub fn mean(list: Vec<u64>) -> Option<f64> {
if list.is_empty() {
return None;
}
let mut count = 0;
let total = list.iter().inspect(|_| count += 1).sum::<u64>();
Some(total as f64 / f64::from(count))
}
#[cfg(test)]
pub mod test {
#[test]
fn median() {
let values = vec![1u64, 8u64, 3u64, 9u64];
let median_value = super::median(values);
assert_eq!(median_value, Some(5.5f64))
}
#[test]
fn mean() {
let values = vec![1u64, 8u64, 3u64, 9u64];
let mean_value = super::mean(values);
assert_eq!(mean_value, Some(5.25f64))
}
}