75 lines
2.2 KiB
Rust
75 lines
2.2 KiB
Rust
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<Rajto> 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<Item = &'a Rajto> + 'a)) -> bool;
|
|
fn rajtoj(&self, uzantnomo: &Uzantnomo) -> Vec<Rajto>;
|
|
fn aldonu_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator<Item = Rajto>));
|
|
fn foriru_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator<Item = Rajto>));
|
|
fn foriru_uzanto(&mut self, uzantnomo: Uzantnomo);
|
|
}
|
|
|
|
pub struct MemRajtigo {
|
|
rajtoj: HashMap<Uzantnomo, HashSet<Rajto>>,
|
|
}
|
|
|
|
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<Item = &'a Rajto> + 'a)) -> bool,
|
|
{
|
|
match self.rajtoj.get(&uzantnomo) {
|
|
Some(rajtoj) => provo(&mut rajtoj.iter()),
|
|
None => false,
|
|
}
|
|
}
|
|
fn rajtoj(&self, uzantnomo: &Uzantnomo) -> Vec<Rajto> {
|
|
self.rajtoj
|
|
.get(&uzantnomo)
|
|
.map(|r| r.into_iter().cloned().collect::<Vec<Rajto>>())
|
|
.unwrap_or(vec![])
|
|
}
|
|
fn aldonu_rajtoj(&mut self, uzantnomo: Uzantnomo, rajtoj: &mut (dyn Iterator<Item = Rajto>)) {
|
|
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<Item = Rajto>)) {
|
|
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);
|
|
}
|
|
}
|