uniui_core 0.0.1

Basic structures like Signal and Slot for uniui_* crates familiy
Documentation
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);
	}
}