use crate::{compose::Compose, Data, Scope, ScopeState};
use core::marker::PhantomData;
pub fn from_fn<F, C>(f: F) -> FromFn<F, C>
where
F: Fn(ScopeState) -> C,
C: Compose,
{
FromFn {
f,
_marker: PhantomData,
}
}
pub struct FromFn<F, C> {
f: F,
_marker: PhantomData<C>,
}
impl<F: Clone, C> Clone for FromFn<F, C> {
fn clone(&self) -> Self {
Self {
f: self.f.clone(),
_marker: PhantomData,
}
}
}
unsafe impl<F, C> Data for FromFn<F, C>
where
F: Fn(ScopeState) -> C,
C: Compose,
{
}
impl<F, C> Compose for FromFn<F, C>
where
F: Fn(ScopeState) -> C,
C: Compose,
{
fn compose(cx: Scope<Self>) -> impl Compose {
(cx.me().f)(&cx)
}
}