use super::{rx_result::RxResultRx, Freeze, MakeRx, MakeUnrx};
use futures::Future;
use serde::{de::DeserializeOwned, Serialize};
use sycamore::prelude::{RcSignal, Scope};
use sycamore_futures::spawn_local_scoped;
pub fn compute_nested_suspense<'a, T, E, F>(cx: Scope<'a>, state: RxResultRx<T, E>, handler: F)
where
F: Future<Output = Result<(), E>> + 'a,
T: MakeRx + Serialize + DeserializeOwned + Clone + 'static,
<T as MakeRx>::Rx: MakeUnrx<Unrx = T> + Freeze + Clone + 'static,
E: Serialize + DeserializeOwned + Clone + 'static,
{
spawn_local_scoped(cx, async move {
let res = handler.await;
if let Err(err) = res {
state.set(Err(err));
}
});
}
pub fn compute_suspense<'a, T, E, F>(cx: Scope<'a>, state: RcSignal<Result<T, E>>, handler: F)
where
F: Future<Output = Result<(), E>> + 'a,
T: Serialize + DeserializeOwned + Clone + 'static,
E: Serialize + DeserializeOwned + Clone + 'static,
{
spawn_local_scoped(cx, async move {
let res = handler.await;
if let Err(err) = res {
state.set(Err(err));
}
});
}