1use std::sync::{Arc, RwLock};
2
3pub enum MistySignal {
4 Schedule,
5}
6
7pub struct SignalEmitter {
8 handler: Arc<RwLock<Arc<dyn Fn(MistySignal) + Send + Sync + 'static>>>,
9}
10
11impl SignalEmitter {
12 pub fn new() -> Self {
13 Self {
14 handler: Arc::new(RwLock::new(Arc::new(|_| {
15 tracing::warn!("singal emiiter is not binding any handler");
16 }))),
17 }
18 }
19
20 pub fn set(&self, f: impl Fn(MistySignal) + Send + Sync + 'static) {
21 let mut w = self.handler.write().unwrap();
22 *w = Arc::new(f);
23 }
24
25 pub(crate) fn emit(&self, singal: MistySignal) {
26 let f = self.handler.read().unwrap().clone();
27 f(singal);
28 }
29}