spair 0.0.9

A framework for single-page application in Rust
Documentation
use crate::{
    component::Component,
    dom::{Keyed, ListItemKey},
    render::{
        base::{ElementUpdater, ElementUpdaterMut, MakeNodesExtensions, NodesExtensions},
        svg::{
            SvgAttributesOnly, SvgElementUpdater, SvgStaticAttributes, SvgStaticAttributesOnly,
            SvgTag,
        },
        ListElementCreation,
    },
};

pub trait SemsForKeyedList<'a, C: Component>:
    Sized + ElementUpdaterMut<C> + MakeNodesExtensions<'a>
{
    fn keyed_list_with_render<I, II, G, K, R>(
        mut self,
        items: II,
        mode: ListElementCreation,
        tag: &'static str,
        fn_get_key: G,
        fn_render: R,
    ) -> NodesExtensions<'a>
    where
        II: IntoIterator<Item = I>,
        G: Fn(&I) -> &K,
        K: PartialEq<ListItemKey>,
        R: Fn(I, SvgElementUpdater<C>),
        ListItemKey: for<'k> From<&'k K>,
    {
        let fn_render = |item: I, element: ElementUpdater<C>| {
            fn_render(item, element.into());
        };
        let _select_element_value_will_be_set_on_dropping_of_the_manager = self
            .element_updater_mut()
            .keyed_list_with_render(items, mode, SvgTag(tag), fn_get_key, fn_render);
        self.make_nodes_extensions()
    }

    fn keyed_lwr_clone<I, II, G, K, R>(
        self,
        items: II,
        tag: &'static str,
        fn_get_key: G,
        fn_render: R,
    ) -> NodesExtensions<'a>
    where
        II: IntoIterator<Item = I>,
        G: Fn(&I) -> &K,
        K: PartialEq<ListItemKey>,
        R: Fn(I, SvgElementUpdater<C>),
        ListItemKey: for<'k> From<&'k K>,
    {
        self.keyed_list_with_render(
            items,
            ListElementCreation::Clone,
            tag,
            fn_get_key,
            fn_render,
        )
    }

    fn keyed_list<I, II>(self, items: II, mode: ListElementCreation) -> NodesExtensions<'a>
    where
        I: Keyed + super::SvgElementRender<C>,
        II: IntoIterator<Item = I>,
        ListItemKey: for<'k> From<&'k <I as Keyed>::Key>,
    {
        self.keyed_list_with_render(items, mode, I::ELEMENT_TAG, I::key, I::render)
    }

    fn keyed_list_clone<I, II>(self, items: II) -> NodesExtensions<'a>
    where
        I: Keyed + super::SvgElementRender<C>,
        II: IntoIterator<Item = I>,
        ListItemKey: for<'k> From<&'k <I as Keyed>::Key>,
    {
        self.keyed_list_with_render(
            items,
            ListElementCreation::Clone,
            I::ELEMENT_TAG,
            I::key,
            I::render,
        )
    }
}

impl<'a, C: Component> SemsForKeyedList<'a, C> for SvgElementUpdater<'a, C> {}
impl<'a, C: Component> SemsForKeyedList<'a, C> for SvgAttributesOnly<'a, C> {}
impl<'a, C: Component> SemsForKeyedList<'a, C> for SvgStaticAttributes<'a, C> {}
impl<'a, C: Component> SemsForKeyedList<'a, C> for SvgStaticAttributesOnly<'a, C> {}