uniui_core 0.0.1

Basic structures like Signal and Slot for uniui_* crates familiy
Documentation
use super::{
	Signal,
	Slot,
	SlotImpl,
};

pub struct Property<T: 'static + Clone> {
	value: T,
	slot: SlotImpl<T>,
	signal: Signal<T>,
}

impl<T: 'static + Clone> Property<T> {
	pub fn new(value: T) -> Property<T> {
		return Property {
			value,
			slot: SlotImpl::new(),
			signal: Signal::new(),
		};
	}

	pub fn set(
		&mut self,
		new_value: T,
	) {
		self.value = new_value;
		if self.signal.has_connections() {
			self.signal.emit(self.value.clone());
		}
	}

	pub fn as_ref(&self) -> &T {
		return &self.value;
	}

	pub fn for_mut(
		&mut self,
		f: &dyn Fn(&mut T),
	) {
		f(&mut self.value);
		if self.signal.has_connections() {
			self.signal.emit(self.value.clone());
		}
	}

	pub fn signal(&mut self) -> &mut Signal<T> {
		return &mut self.signal;
	}

	pub fn slot(&self) -> &dyn Slot<T> {
		return &self.slot;
	}

	/// return true  if was updated and false owervise
	pub fn try_update(&mut self) -> bool {
		let mut result = false;

		for v in self.slot.data_iter() {
			self.value = v;
			result = true;
			if self.signal.has_connections() {
				self.signal.emit(self.value.clone());
			}
		}

		return result;
	}
}