#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::Fighter;
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Armies {
fighters: HashMap<u64, Fighter>,
}
impl Armies {
pub fn new() -> Self {
Self {
fighters: HashMap::new(),
}
}
fn generate_unique_id(&self) -> u64 {
loop {
let id = rand::random::<u64>();
if !self.fighters.contains_key(&id) {
return id;
}
}
}
pub fn add_fighter(&mut self, fighter: Fighter) -> u64 {
let id = self.generate_unique_id();
self.fighters.insert(id, fighter);
id
}
pub fn set_fighter(&mut self, id: u64, fighter: Fighter) {
self.fighters.insert(id, fighter);
}
pub fn remove_fighter(&mut self, id: &u64) -> Option<Fighter> {
self.fighters.remove(id)
}
pub fn get_fighter(&self, id: &u64) -> Option<&Fighter> {
self.fighters.get(id)
}
pub fn get_fighter_mut(&mut self, id: &u64) -> Option<&mut Fighter> {
self.fighters.get_mut(id)
}
pub fn fighter_count(&self) -> usize {
self.fighters.len()
}
pub fn iter(&self, odd_even: bool) -> impl Iterator<Item = (&u64, &Fighter)> {
let mut entries: Vec<_> = self.fighters.iter().collect();
if odd_even {
entries.sort_by(|(a, _), (b, _)| b.cmp(a));
} else {
entries.sort_by_key(|(id, _)| *id);
}
entries.into_iter()
}
pub fn iter_mut(&mut self, odd_even: bool) -> impl Iterator<Item = (&u64, &mut Fighter)> {
let mut entries: Vec<_> = self.fighters.iter_mut().collect();
if odd_even {
entries.sort_by(|(a, _), (b, _)| b.cmp(a));
} else {
entries.sort_by_key(|(id, _)| *id);
}
entries.into_iter()
}
pub fn unsorted_iter(&self) -> impl Iterator<Item = &Fighter> {
self.fighters.values()
}
pub fn unsorted_iter_with_ids(&self) -> impl Iterator<Item = (&u64, &Fighter)> {
self.fighters.iter()
}
}
impl Default for Armies {
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Display for Armies {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let alive = self.fighters.values().filter(|f| f.is_alive()).count();
write!(
f,
"Armies ({} fighters, {} alive)",
self.fighters.len(),
alive
)
}
}