use std::rc::Rc;
use crate::{
Computed, DomComment, DomNode, computed::struct_mut::ValueMut, driver_module::get_driver_dom,
};
pub fn render_value<T: Clone + PartialEq + 'static>(
computed: Computed<T>,
render: impl Fn(T) -> DomNode + 'static,
) -> DomNode {
render_value_option(computed, move |value| -> Option<DomNode> {
Some(render(value))
})
}
pub fn render_value_option<T: Clone + PartialEq + 'static>(
computed: Computed<T>,
render: impl Fn(T) -> Option<DomNode> + 'static,
) -> DomNode {
let render = Rc::new(render);
DomComment::new_marker("v", move |parent_id, comment_id| {
let current_node: ValueMut<Option<DomNode>> = ValueMut::new(None);
Some(computed.clone().subscribe({
let render = render.clone();
move |value| {
let new_element = render(value).inspect(|new_element| {
get_driver_dom().insert_before(
parent_id,
new_element.id_dom(),
Some(comment_id),
);
});
current_node.change(|current| {
*current = new_element;
});
}
}))
})
.into()
}