use crate::NotifierPendingAt;
use concepts::{FunctionFqn, component_id::ComponentDigest};
use hashbrown::HashMap;
use tokio::sync::mpsc;
use tracing::debug;
#[derive(Default)]
pub struct PendingFfqnSubscribersHolder {
by_ffqns: HashMap<FunctionFqn, (mpsc::Sender<()>, u64)>,
by_component: HashMap<ComponentDigest , (mpsc::Sender<()>, u64)>,
}
impl PendingFfqnSubscribersHolder {
pub fn notify(&self, notifier: &NotifierPendingAt) {
if let Some((subscription, _)) = self.by_ffqns.get(¬ifier.ffqn) {
debug!("Notifying pending subscriber by ffqn");
let _ = subscription.try_send(());
}
if let Some((subscription, _)) = self.by_component.get(¬ifier.component_input_digest) {
debug!("Notifying pending subscriber by component");
let _ = subscription.try_send(());
}
}
pub fn insert_ffqn(&mut self, ffqn: FunctionFqn, value: (mpsc::Sender<()>, u64)) {
self.by_ffqns.insert(ffqn, value);
}
pub fn remove_ffqn(&mut self, ffqn: &FunctionFqn) -> Option<(mpsc::Sender<()>, u64)> {
self.by_ffqns.remove(ffqn)
}
pub fn insert_by_component(
&mut self,
input_content_digest: ComponentDigest,
value: (mpsc::Sender<()>, u64),
) {
self.by_component.insert(input_content_digest, value);
}
pub fn remove_by_component(
&mut self,
input_content_digest: &ComponentDigest,
) -> Option<(mpsc::Sender<()>, u64)> {
self.by_component.remove(input_content_digest)
}
}