use gpui::{App, AppContext, Entity};
pub struct Signal<T> {
entity: Entity<T>,
}
impl<T: 'static> Signal<T> {
pub fn new(cx: &mut App, value: T) -> Self {
Signal {
entity: cx.new(|_cx| value),
}
}
pub fn entity(&self) -> &Entity<T> {
&self.entity
}
pub fn read<'a>(&self, cx: &'a App) -> &'a T {
self.entity.read(cx)
}
pub fn get(&self, cx: &App) -> T
where
T: Clone,
{
self.entity.read(cx).clone()
}
pub fn set(&self, cx: &mut App, value: T) {
self.entity.update(cx, |slot, cx| {
*slot = value;
cx.notify();
});
}
pub fn set_if_changed(&self, cx: &mut App, value: T)
where
T: PartialEq,
{
self.entity.update(cx, |slot, cx| {
if *slot != value {
*slot = value;
cx.notify();
}
});
}
pub fn update(&self, cx: &mut App, f: impl FnOnce(&mut T)) {
self.entity.update(cx, |slot, cx| {
f(slot);
cx.notify();
});
}
}
impl<T> Clone for Signal<T> {
fn clone(&self) -> Self {
Signal {
entity: self.entity.clone(),
}
}
}