use crate::core::{Id, Ordinal, Tactic};
#[derive(Debug)]
pub struct Pushover {
pub preferred: Vec<Id>,
pub pushover: Vec<Id>,
}
impl Pushover {
#[must_use]
pub const fn new(preferred: Vec<Id>, pushover: Vec<Id>) -> Self {
Self {
preferred,
pushover,
}
}
}
impl Tactic<Ordinal> for Pushover {
fn apply(&self, ballot: Ordinal) -> Ordinal {
let mut pushover_ranking: Vec<Id> = (*ballot).clone();
pushover_ranking.retain(|c| !self.preferred.contains(c) && !self.pushover.contains(c));
let mut ranking = self.preferred.clone();
ranking.append(&mut self.pushover.clone());
ranking.append(&mut pushover_ranking);
Ordinal(ranking)
}
}