use crate::aĆ­tentigo::Uzantnomo; use std::collections::{HashMap, HashSet}; #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct Rajto(String); impl From<&str> for Rajto { fn from(s: &str) -> Self { Rajto(s.to_owned()) } } impl From for String { fn from(s: Rajto) -> Self { s.0.clone() } } pub trait Rajtigo { fn havas_rajton<'a, F>(&'a self, uzantnomo: Uzantnomo, provo: F) -> bool where F: FnOnce(&mut (dyn Iterator + 'a)) -> bool; fn rajtoj(&self, uzantnomo: &Uzantnomo) -> Vec; fn aldonu_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator)); fn foriru_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator)); fn foriru_uzanto(&mut self, uzantnomo: Uzantnomo); } pub struct MemRajtigo { rajtoj: HashMap>, } impl MemRajtigo { pub fn new() -> Self { MemRajtigo { rajtoj: HashMap::new(), } } } impl Rajtigo for MemRajtigo { fn havas_rajton<'a, F>(&'a self, uzantnomo: Uzantnomo, provo: F) -> bool where F: FnOnce(&mut (dyn Iterator + 'a)) -> bool, { match self.rajtoj.get(&uzantnomo) { Some(rajtoj) => provo(&mut rajtoj.iter()), None => false, } } fn rajtoj(&self, uzantnomo: &Uzantnomo) -> Vec { self.rajtoj .get(&uzantnomo) .map(|r| r.into_iter().cloned().collect::>()) .unwrap_or(vec![]) } fn aldonu_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator)) { let valoro = self.rajtoj.entry(uzantnomo).or_insert(HashSet::new()); while let Some(r) = rajtoj.next() { valoro.insert(r); } } fn foriru_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator)) { let valoro = self.rajtoj.entry(uzantnomo).or_insert(HashSet::new()); while let Some(r) = rajtoj.next() { valoro.remove(&r); } } fn foriru_uzanto(&mut self, uzantnomo: Uzantnomo) { let _ = self.rajtoj.remove(&uzantnomo); } }