sc_utils/notification/
registry.rs1use std::collections::HashSet;
20
21use crate::{
22 id_sequence::SeqID,
23 pubsub::{Dispatch, Subscribe, Unsubscribe},
24};
25
26#[derive(Debug, Default)]
28pub(super) struct Registry {
29 pub(super) subscribers: HashSet<SeqID>,
30}
31
32impl Subscribe<()> for Registry {
33 fn subscribe(&mut self, _subs_key: (), subs_id: SeqID) {
34 self.subscribers.insert(subs_id);
35 }
36}
37impl Unsubscribe for Registry {
38 fn unsubscribe(&mut self, subs_id: SeqID) {
39 self.subscribers.remove(&subs_id);
40 }
41}
42
43impl<MakePayload, Payload, Error> Dispatch<MakePayload> for Registry
44where
45 MakePayload: FnOnce() -> Result<Payload, Error>,
46 Payload: Clone,
47{
48 type Item = Payload;
49 type Ret = Result<(), Error>;
50
51 fn dispatch<F>(&mut self, make_payload: MakePayload, mut dispatch: F) -> Self::Ret
52 where
53 F: FnMut(&SeqID, Self::Item),
54 {
55 if !self.subscribers.is_empty() {
56 let payload = make_payload()?;
57 for subs_id in &self.subscribers {
58 dispatch(subs_id, payload.clone());
59 }
60 }
61 Ok(())
62 }
63}