Ported example 5

This commit is contained in:
2026-03-22 02:30:11 -04:00
parent 0d73e43a92
commit cf53a9f86d
5 changed files with 815 additions and 38 deletions

View File

@@ -154,7 +154,7 @@ mod tests {
use std::cell::{Cell as Counter, RefCell};
use std::rc::Rc;
use ruin_runtime::{queue_task, run};
use ruin_runtime::{queue_future, queue_task, run, yield_now};
use crate::{Reactor, cell_in};
@@ -213,4 +213,36 @@ mod tests {
run();
assert_eq!(reruns.get(), 1);
}
#[test]
fn effects_rerun_after_async_future_updates_a_dependency() {
let seen = Rc::new(RefCell::new(Vec::new()));
let handle_slot = Rc::new(RefCell::new(None::<EffectHandle>));
queue_task({
let seen = Rc::clone(&seen);
let handle_slot = Rc::clone(&handle_slot);
move || {
let reactor = Reactor::new();
let source = cell_in(&reactor, 0usize);
let effect = reactor.effect({
let seen = Rc::clone(&seen);
let source = source.clone();
move || seen.borrow_mut().push(source.get())
});
*handle_slot.borrow_mut() = Some(effect);
std::mem::drop(queue_future({
let source = source.clone();
async move {
yield_now().await;
let _ = source.set(1);
}
}));
}
});
run();
assert_eq!(&*seen.borrow(), &[0, 1]);
}
}