1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use std::sync::{Arc, Weak, Mutex};
use super::{Emitter, Receiver};
pub struct Signal<'a, D> {
receivers: Vec<Weak<Mutex<Box<dyn Receiver<D> + 'a>>>>,
}
impl<'a, D> Signal<'a, D> {
pub fn new() -> Self {
Signal {
receivers: Vec::default(),
}
}
pub fn push<R>(&mut self, receiver: R) where R: Receiver<D> + Send + 'a {
self.receivers.push(Arc::downgrade(&Arc::new(Mutex::new(Box::new(receiver)))));
}
}
impl<'a, D> Emitter<D> for Signal<'a, D> {
fn emit(&mut self, data: &D) {
for receiver in &mut self.receivers {
if let Some(receiver) = receiver.upgrade() {
if let Ok(mut receiver) = receiver.lock() {
receiver.receive(data);
}
}
}
}
}