use super::Slot;
use std::sync::mpsc::Sender;
pub struct Signal<T> {
listeners: Vec<Box<dyn FnMut(&T)>>,
senders: Vec<Sender<T>>,
}
impl<T: 'static + Clone> Signal<T> {
pub fn new() -> Signal<T> {
return Signal {
listeners: Vec::new(),
senders: Vec::new(),
};
}
pub fn emit(
&mut self,
t: T,
) {
self.listeners.iter_mut().for_each(|l| {
l.as_mut()(&t);
});
self.senders.iter().for_each(|s| {
match s.send(t.clone()) {
Ok(_) => trace!("sended to slot"),
Err(e) => warn!("send to slot err:{:?}", e),
}
});
}
pub fn has_connections(&self) -> bool {
return (self.listeners.len() + self.senders.len()) > 0;
}
pub fn connect_func<F: 'static + FnMut(&T)>(
&mut self,
f: F,
) {
self.listeners.push(Box::new(f));
}
pub fn connect_slot(
&mut self,
slot: &dyn Slot<T>,
) {
self.connect_sender(slot.connector());
}
pub fn connect_sender(
&mut self,
sender: Sender<T>,
) {
self.senders.push(sender);
}
}