espada 0.3.1

Texas Hold'em poker odds evaluator
Documentation
#[derive(Debug, Clone, Copy)]
pub struct CalculationScope {
    pub turn_from: u8,
    pub river_from: u8,
    pub turn_to: u8,
    pub river_to: u8,
}

pub fn calculate_scopes(count: u32) -> Vec<CalculationScope> {
    let mut scopes: Vec<CalculationScope> = vec![];
    let mut prev_t = 0_u8;
    let mut prev_r = 1_u8;

    for i in 0..count {
        let x: f32 = 48.0 - 48.0 * (1.0 - (i as f32 + 1.0) / count as f32).sqrt();

        let turn_to = x.floor() as u8;
        let river_to = ((48 - turn_to) as f32 * (x % 1.0)).ceil() as u8 + turn_to + 1;

        scopes.push(CalculationScope {
            turn_from: prev_t,
            turn_to,
            river_from: prev_r,
            river_to,
        });

        prev_t = turn_to;
        prev_r = river_to;
    }

    scopes
}

#[cfg(test)]
mod tests_calculate_scopes {
    use super::*;

    #[test]
    fn it_divides_into_4_scopes() {
        let scopes = calculate_scopes(4);

        assert_eq!(scopes.len(), 4);
        assert_eq!(scopes[0].turn_from, 0);
        assert_eq!(scopes[0].river_from, 1);
        assert_eq!(scopes[0].turn_to, 6);
        assert_eq!(scopes[0].river_to, 26);
        assert_eq!(scopes[1].turn_from, 6);
        assert_eq!(scopes[1].river_from, 26);
        assert_eq!(scopes[1].turn_to, 14);
        assert_eq!(scopes[1].river_to, 18);
        assert_eq!(scopes[2].turn_from, 14);
        assert_eq!(scopes[2].river_from, 18);
        assert_eq!(scopes[2].turn_to, 24);
        assert_eq!(scopes[2].river_to, 25);
        assert_eq!(scopes[3].turn_from, 24);
        assert_eq!(scopes[3].river_from, 25);
        assert_eq!(scopes[3].turn_to, 48);
        assert_eq!(scopes[3].river_to, 49);
    }

    #[test]
    fn it_divides_into_10_scopes() {
        let scopes = calculate_scopes(10);

        assert_eq!(scopes.len(), 10);
        assert_eq!(scopes[0].turn_from, 0);
        assert_eq!(scopes[0].river_from, 1);
        assert_eq!(scopes[0].turn_to, 2);
        assert_eq!(scopes[0].river_to, 25);
        assert_eq!(scopes[1].turn_from, 2);
        assert_eq!(scopes[1].river_from, 25);
        assert_eq!(scopes[1].turn_to, 5);
        assert_eq!(scopes[1].river_to, 9);
        assert_eq!(scopes[2].turn_from, 5);
        assert_eq!(scopes[2].river_from, 9);
        assert_eq!(scopes[2].turn_to, 7);
        assert_eq!(scopes[2].river_to, 43);
        assert_eq!(scopes[3].turn_from, 7);
        assert_eq!(scopes[3].river_from, 43);
        assert_eq!(scopes[3].turn_to, 10);
        assert_eq!(scopes[3].river_to, 43);
        assert_eq!(scopes[4].turn_from, 10);
        assert_eq!(scopes[4].river_from, 43);
        assert_eq!(scopes[4].turn_to, 14);
        assert_eq!(scopes[4].river_to, 18);
        assert_eq!(scopes[5].turn_from, 14);
        assert_eq!(scopes[5].river_from, 18);
        assert_eq!(scopes[5].turn_to, 17);
        assert_eq!(scopes[5].river_to, 38);
        assert_eq!(scopes[6].turn_from, 17);
        assert_eq!(scopes[6].river_from, 38);
        assert_eq!(scopes[6].turn_to, 21);
        assert_eq!(scopes[6].river_to, 42);
        assert_eq!(scopes[7].turn_from, 21);
        assert_eq!(scopes[7].river_from, 42);
        assert_eq!(scopes[7].turn_to, 26);
        assert_eq!(scopes[7].river_to, 39);
        assert_eq!(scopes[8].turn_from, 26);
        assert_eq!(scopes[8].river_from, 39);
        assert_eq!(scopes[8].turn_to, 32);
        assert_eq!(scopes[8].river_to, 47);
        assert_eq!(scopes[9].turn_from, 32);
        assert_eq!(scopes[9].river_from, 47);
        assert_eq!(scopes[9].turn_to, 48);
        assert_eq!(scopes[9].river_to, 49);
    }
}