vertigo 0.11.2

Reactive Real-DOM library with SSR for Rust
Documentation
use std::rc::Rc;

use crate::{
    Computed, DomComment, DomNode, computed::struct_mut::ValueMut, driver_module::get_driver_dom,
};

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()
}

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))
    })
}