vertigo 0.2.0-alpha

Reactive Real-DOM library for Rust
Documentation
use crate::{
    dom::{
        dom_fragment::DomFragment,
        dom_node::DomNodeFragment,
    },
    struct_mut::ValueMut,
    Computed, get_driver, DomComment, DomNode,
};

pub fn render_value_option<T: Clone + PartialEq + 'static, R: Into<DomNodeFragment>>(
    computed: Computed<T>,
    render: impl Fn(T) -> Option<R> + 'static
) -> DomFragment {
    let comment = DomComment::new("value element");
    let comment_id = comment.id_dom();

    DomFragment::new(comment_id, move |parent_id| {
        let driver = get_driver();

        driver.inner.dom.insert_before(parent_id, comment_id, None);
        let current_node: ValueMut<Option<DomNode>> = ValueMut::new(None);

        let client = computed.subscribe(move |value| {

            let new_element = render(value).map(|item| {
                let new_element: DomNodeFragment = item.into();
                driver.inner.dom.insert_before(parent_id, new_element.id(), Some(comment_id));
                new_element.convert_to_node(parent_id)
            });

            current_node.change(|current| {
                *current = new_element;
            });
        });

        comment.add_subscription(client);
        comment
    })
}

pub fn render_value<T: Clone + PartialEq + 'static, R: Into<DomNodeFragment>>(
    computed: Computed<T>,
    render: impl Fn(T) -> R + 'static
) -> DomFragment {
    render_value_option(computed, move |value| -> Option<R> {
        Some(render(value))
    })
}