use super::signal::{RwSignal, create_signal};
#[derive(Clone, Copy)]
pub struct Trigger {
inner: RwSignal<()>,
}
pub fn create_trigger() -> Trigger {
Trigger {
inner: create_signal(()),
}
}
impl Trigger {
pub(crate) const fn from_signal(inner: RwSignal<()>) -> Self {
Self { inner }
}
pub fn notify(&self) {
self.inner.set_always(());
}
pub fn track(&self) {
self.inner.get();
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::reactive::create_effect;
use std::cell::Cell;
use std::rc::Rc;
#[test]
fn notify_reruns_trackers_every_time() {
let trigger = create_trigger();
let runs = Rc::new(Cell::new(0));
let counter = runs.clone();
create_effect(move || {
trigger.track();
counter.set(counter.get() + 1);
});
assert_eq!(runs.get(), 1, "initial run");
trigger.notify();
trigger.notify();
assert_eq!(
runs.get(),
3,
"every notify must re-run the tracker — no equality dedup on ()"
);
}
}