use std::{fmt, sync::Arc};
use leptos::{
children::ToChildren,
prelude::{AnyView, IntoAny, Render},
IntoView,
};
#[derive(Clone)]
pub struct ChildrenFn(Arc<dyn Fn() -> AnyView + Send + Sync>);
impl ChildrenFn {
pub fn new<F, IV>(f: F) -> Self
where
F: Fn() -> IV + Send + Sync + 'static,
IV: IntoView + 'static,
<IV as Render>::State: 'static,
{
Self(Arc::new(move || f().into_view().into_any()))
}
pub fn into_inner(self) -> Arc<dyn Fn() -> AnyView + Send + Sync> {
self.0
}
pub fn call(&self) -> AnyView {
(self.0)()
}
}
impl fmt::Debug for ChildrenFn {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("ChildrenFn")
.field(&"Arc<dyn Fn() -> AnyView + Send + Sync>")
.finish()
}
}
impl<F> ToChildren<F> for ChildrenFn
where
F: Fn() -> AnyView + 'static + Send + Sync,
{
#[inline]
fn to_children(f: F) -> Self {
ChildrenFn(Arc::new(f))
}
}