simulator-api 0.24.0

Wire-protocol types for the Solana simulator backtest WebSocket API
Documentation
//! Number rendering the report sections share.

/// Sorts in place, so a caller that also indexes the values (the IQR does) reads them ordered.
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);
    }
}