Skip to main content

lgui_core/core/component/
observable.rs

1use std::sync::Arc;
2
3use super::UiEffect;
4
5pub type ObservableListener = Arc<dyn Fn() + Send + Sync + 'static>;
6
7pub struct Observable<T> {
8    id: u64,
9    read: Arc<dyn Fn() -> T + Send + Sync + 'static>,
10    subscribe: Arc<dyn Fn(ObservableListener) -> UiEffect + Send + Sync + 'static>,
11}
12
13impl<T> Clone for Observable<T> {
14    fn clone(&self) -> Self {
15        Self {
16            id: self.id,
17            read: Arc::clone(&self.read),
18            subscribe: Arc::clone(&self.subscribe),
19        }
20    }
21}
22
23impl<T> Observable<T> {
24    pub fn new(
25        id: u64,
26        read: impl Fn() -> T + Send + Sync + 'static,
27        subscribe: impl Fn(ObservableListener) -> UiEffect + Send + Sync + 'static,
28    ) -> Self {
29        Self {
30            id,
31            read: Arc::new(read),
32            subscribe: Arc::new(subscribe),
33        }
34    }
35
36    pub const fn id(&self) -> u64 {
37        self.id
38    }
39
40    pub fn read(&self) -> T {
41        (self.read)()
42    }
43
44    pub fn subscribe(&self, listener: ObservableListener) -> UiEffect {
45        (self.subscribe)(listener)
46    }
47}