use hydra_dashmap::DashMap;
use once_cell::sync::Lazy;
use crate::ProcessItem;
use crate::ProcessSend;
use crate::Reference;
static ALIASES: Lazy<DashMap<u64, Alias>> = Lazy::new(DashMap::new);
#[derive(Clone)]
pub struct Alias {
pub sender: ProcessSend,
pub reply: bool,
}
pub fn alias_create(sender: ProcessSend, reference: Reference, reply: bool) {
ALIASES.insert(reference.id(), Alias { sender, reply });
}
pub fn alias_destroy(reference: Reference) -> bool {
ALIASES.remove(&reference.id()).is_some()
}
pub fn alias_destroy_all<'a, A: IntoIterator<Item = &'a u64>>(ids: A) {
for id in ids {
ALIASES.remove(id);
}
}
pub fn alias_retrieve(reference: Reference) -> Option<Alias> {
let mut active: Option<Alias> = None;
let result = ALIASES.remove_if(&reference.id(), |_, alias| {
if alias.reply {
true
} else {
active = Some(alias.clone());
false
}
});
result
.map(|(_, alias)| {
let _ = alias
.sender
.send(ProcessItem::AliasDeactivated(reference.id()));
alias
})
.or(active)
}