ori_core/reactive/
event.rs

1use crate::{Scope, SendSync, Sendable, SharedSignal};
2
3#[derive(Debug)]
4pub struct EventSignal<T: 'static> {
5    signal: SharedSignal<Option<T>>,
6}
7
8impl<T> EventSignal<T> {
9    pub fn new() -> Self {
10        Self {
11            signal: SharedSignal::new(None),
12        }
13    }
14
15    pub fn track(&self) {
16        self.signal.track();
17    }
18
19    pub fn subscribe<'a>(&self, cx: Scope<'a>, mut callback: impl FnMut(&T) + Sendable + 'a)
20    where
21        T: SendSync,
22    {
23        let signal = self.signal.clone();
24        cx.effect(move || {
25            if let Some(event) = signal.get().as_ref() {
26                cx.untrack(|| {
27                    callback(event);
28                });
29            }
30        });
31    }
32
33    pub fn emit(&self, event: T) {
34        self.signal.set(Some(event));
35    }
36}
37
38impl<T> Default for EventSignal<T> {
39    fn default() -> Self {
40        Self::new()
41    }
42}
43
44impl<T> Clone for EventSignal<T> {
45    fn clone(&self) -> Self {
46        Self {
47            signal: self.signal.clone(),
48        }
49    }
50}