ori_core/reactive/
event.rs1use 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}