diff --git a/src/header.rs b/src/header.rs index a3d8605..ec8896f 100644 --- a/src/header.rs +++ b/src/header.rs @@ -2,12 +2,12 @@ use std::collections::HashMap; use itertools::Itertools; -use crate::candidate::Candidate; +use crate::{candidate::Candidate, party::Party}; #[derive(Debug)] pub struct Header { - pub parties: Vec, + pub parties: Vec, pub candidates: Vec, } @@ -29,6 +29,7 @@ impl Header { }); } else if let Some(party_id) = parties_lookup.get(party).copied() { + header.parties[party_id].member_ids.push(header.candidates.len()); header.candidates.push(Candidate { name: name.to_owned(), party_id: Some(party_id), @@ -36,7 +37,7 @@ impl Header { } else { parties_lookup.insert(party, header.parties.len()); - header.parties.push(name.to_owned()); + header.parties.push(Party::new(name.to_owned())); } } diff --git a/src/main.rs b/src/main.rs index 433bbc4..cf189d0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ use itertools::Itertools; pub mod candidate; pub mod ballot; pub mod header; +pub mod party; mod counter; fn main() { @@ -42,11 +43,11 @@ fn main() { let ty = BallotType::Candidate; let winner_count = 6; let names = match ty { - BallotType::Party => counter.header.parties.clone(), + BallotType::Party => counter.header.parties.iter().map(|v| v.name.clone()).collect_vec(), BallotType::Candidate => counter.header.candidates.iter().map(|v| format!("{}: {}", v.name, - v.party_id.map_or("IND", |id| &counter.header.parties[id]), - )).collect(), + v.party_id.map_or("IND", |id| &counter.header.parties[id].name), + )).collect_vec(), }; let mut running = vec![true; names.len()]; let mut first = true; @@ -61,11 +62,18 @@ fn main() { print!("{name:?}"); } println!(); + eprintln!("Running election rounds:"); - for _ in 0..(running.len() - winner_count) { - let scores = counter.count_primaries(ty, &running); - let lowest = match scores.iter().copied().enumerate().filter(|&(i,_)| running[i]).min_by(|a, b| u32::cmp(&a.1, &b.1)) { - Some((index, _)) => index, + let mut scores: Vec = Vec::new(); + + for index in 0..(running.len() - winner_count) { + scores = counter.count_primaries(ty, &running); + let (id_worst, score_worst) = match scores.iter().copied().enumerate().filter(|&(i,_)| running[i]).min_by(|a, b| u32::cmp(&a.1, &b.1)) { + Some(v) => v, + None => break + }; + let (id_best, score_best) = match scores.iter().copied().enumerate().filter(|&(i,_)| running[i]).min_by(|a, b| u32::cmp(&b.1, &a.1)) { + Some(v) => v, None => break, }; let mut first = true; @@ -80,14 +88,20 @@ fn main() { print!("{score}"); } } - running[lowest] = false; + running[id_worst] = false; + println!(); + + + eprintln!(" {index}:"); + eprintln!(" Best: {} ({score_best})", names[id_best]); + eprintln!(" Worst: {} ({score_worst})", names[id_worst]); } let winners = names.iter().enumerate().filter_map(|(index, name)| match running[index] { - true => Some(name.as_str()), + true => Some((name.as_str(), scores[index])), false => None, }).collect_vec(); - eprintln!("Winners: {winners:?}"); + eprintln!("Winners: {winners:#?}"); } diff --git a/src/party.rs b/src/party.rs index e69de29..09747db 100644 --- a/src/party.rs +++ b/src/party.rs @@ -0,0 +1,16 @@ + +#[derive(Debug)] +pub struct Party { + pub name: String, + pub member_ids: Vec, +} + +impl Party { + pub fn new(name: String) -> Self { + Self { + name, + member_ids: Vec::new(), + } + } +} +