ori-core 0.1.0-alpha.1

Core library for Ori, a declarative UI framework for Rust.
Documentation
use crate::{Scope, SendSync, Sendable, SharedSignal};

#[derive(Debug)]
pub struct EventSignal<T: 'static> {
    signal: SharedSignal<Option<T>>,
}

impl<T> EventSignal<T> {
    pub fn new() -> Self {
        Self {
            signal: SharedSignal::new(None),
        }
    }

    pub fn track(&self) {
        self.signal.track();
    }

    pub fn subscribe<'a>(&self, cx: Scope<'a>, mut callback: impl FnMut(&T) + Sendable + 'a)
    where
        T: SendSync,
    {
        let signal = self.signal.clone();
        cx.effect(move || {
            if let Some(event) = signal.get().as_ref() {
                cx.untrack(|| {
                    callback(event);
                });
            }
        });
    }

    pub fn emit(&self, event: T) {
        self.signal.set(Some(event));
    }
}

impl<T> Default for EventSignal<T> {
    fn default() -> Self {
        Self::new()
    }
}

impl<T> Clone for EventSignal<T> {
    fn clone(&self) -> Self {
        Self {
            signal: self.signal.clone(),
        }
    }
}