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