lgui_core/core/component/
observable.rs1use 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}