use effect_rs::{Effect, Exit, Runtime, core::FiberRef};
#[test]
fn test_fiber_ref_isolation() {
let rt = Runtime::new();
let fiber_ref = FiberRef::new(0);
let program = fiber_ref.set(10).flat_map(move |_| {
let fr = fiber_ref.clone();
fiber_ref
.get()
.flat_map(move |val| {
assert_eq!(val, 10);
Effect::succeed(val)
})
.flat_map(move |_| {
let _fr2 = fr.clone();
let fr3 = fr.clone();
Effect::succeed(100)
.fork()
.flat_map(move |fiber| {
Effect::async_effect(move || async move { fiber.join().await })
.flat_map(Effect::done)
})
.flat_map(move |_| {
fr3.get().flat_map(move |val| {
assert_eq!(val, 10, "Parent should see original value");
Effect::succeed(val)
})
})
})
});
let result = rt.block_on(program, ());
assert!(matches!(result, Exit::Success(10)));
}