pub(super) fn median(values: &mut [f64]) -> f64 {
values.sort_by(|a, b| a.total_cmp(b));
let n = values.len();
match n % 2 {
1 => values[n / 2],
_ => (values[n / 2 - 1] + values[n / 2]) / 2.0,
}
}
pub(super) fn commas_u(n: u64) -> String {
let s = n.to_string();
let mut out = String::new();
for (i, c) in s.chars().enumerate() {
if i > 0 && (s.len() - i).is_multiple_of(3) {
out.push(',');
}
out.push(c);
}
out
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
#[rstest]
#[case::odd(&[3.0, 1.0, 2.0], 2.0)]
#[case::even(&[4.0, 1.0, 2.0, 3.0], 2.5)]
fn median_sorts_then_splits(#[case] values: &[f64], #[case] expected: f64) {
assert_eq!(median(&mut values.to_vec()), expected);
}
#[rstest]
#[case::zero(0, "0")]
#[case::under_a_group(999, "999")]
#[case::first_group(1_000, "1,000")]
#[case::many_groups(1_234_567, "1,234,567")]
fn commas_group_by_thousands(#[case] n: u64, #[case] expected: String) {
assert_eq!(commas_u(n), expected);
}
}