Shared Rust kernels

ported/rank_common

All modules · quoted at commit 9e1884369a67 of DnaCalc/DnaCalc. Comments are the source's own.

rank_eq · 15 lines · calc-func/src/ported/rank_common.rs on GitHub
pub fn rank_eq(number: f64, values: &[f64], order: RankOrder) -> Result<f64, WorksheetErrorCode> {
    if values.is_empty() {
        return Err(WorksheetErrorCode::NA);
    }
    let matches = values.iter().filter(|value| **value == number).count();
    if matches == 0 {
        return Err(WorksheetErrorCode::NA);
    }

    let rank = match order {
        RankOrder::Descending => values.iter().filter(|value| **value > number).count() + 1,
        RankOrder::Ascending => values.iter().filter(|value| **value < number).count() + 1,
    };
    Ok(rank as f64)
}

Used by 3 functions.

rank_avg · 5 lines · calc-func/src/ported/rank_common.rs on GitHub
pub fn rank_avg(number: f64, values: &[f64], order: RankOrder) -> Result<f64, WorksheetErrorCode> {
    let first = rank_eq(number, values, order)?;
    let matches = values.iter().filter(|value| **value == number).count() as f64;
    Ok(first + (matches - 1.0) / 2.0)
}

Used by 3 functions.