Skip to content

Commit e8f61a8

Browse files
committed
wip: redesign csr
1 parent 51d2aca commit e8f61a8

File tree

14 files changed

+271
-227
lines changed

14 files changed

+271
-227
lines changed

packages/frender-common/src/reactive_value.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,20 @@ pub trait ReusableRendererOfKind<VK: ?Sized + ReactiveValueKind> {
5353
fn reuse(self, provide_value: impl ProvideValueOfKind<VK>) -> Self::Output;
5454
}
5555

56+
/// `for<R: FnOnce(VK::Value<'_>) -> Out, Out> RenderInitPinned<R, S, Output = R::RenderOutput>`
57+
pub trait ReactiveValueRenderInitPinned<VK: ?Sized + ReactiveValueKind, S: ?Sized>: Sized {
58+
type RenderInitPinned<R: FnOnce(VK::Value<'_>) -> Out, Out>: RenderInitPinned<R, S, Output = Out>
59+
+ From<Self>;
60+
}
61+
5662
pub trait ReactiveValue<VK: ?Sized + ReactiveValueKind> {
5763
type PinnedState: ReactiveValueState<ReactiveValueKind = VK>;
58-
type PinnedRenderInit<R: FnOnce(VK::Value<'_>) -> Out, Out>: RenderInitPinned<
59-
R,
60-
Self::PinnedState,
61-
Output = Out,
62-
>;
64+
type PinnedRenderInit: ReactiveValueRenderInitPinned<VK, Self::PinnedState>;
6365

6466
/// Requires [`Unpin`] so that [`ReactiveValueState`] can be reused without defining another trait taking `&mut self`.
6567
type UnpinnedState: Unpin + ReactiveValueState<ReactiveValueKind = VK>;
6668

67-
/// `state` is `Default::default()` at a pinned place.
68-
fn pinned_render_init<R: FnOnce(VK::Value<'_>) -> Out, Out>(
69-
self,
70-
) -> (Self::PinnedState, Self::PinnedRenderInit<R, Out>);
69+
fn pinned_render_init(self) -> (Self::PinnedState, Self::PinnedRenderInit);
7170

7271
/// `old_state` has been [unmounted](ReactiveStrStateUnmount::reactive_value_state_unmount) but not necessarily set to `Default::default()`.
7372
fn pinned_render_init_by_reusing<Out>(
@@ -233,8 +232,12 @@ pub fn unpinned_render_init_with_pinned<
233232
where
234233
V::PinnedState: Unpin,
235234
{
236-
let (mut state, render_init) = V::pinned_render_init::<R, Out>(this);
235+
let (mut state, render_init) = V::pinned_render_init(this);
237236

238-
let out = render_init.render_init_pinned(renderer, ::core::pin::Pin::new(&mut state));
237+
let out = <<V::PinnedRenderInit as ReactiveValueRenderInitPinned<VK, _>>::RenderInitPinned<
238+
R,
239+
Out,
240+
>>::from(render_init)
241+
.render_init_pinned(renderer, ::core::pin::Pin::new(&mut state));
239242
(state, out)
240243
}

packages/frender-common/src/reactive_value/csr_str.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
use std::{marker::PhantomData, pin::Pin, task::Poll};
1+
use std::{pin::Pin, task::Poll};
22

33
use crate::{
44
csr::StateUnmount, reactive_value::ProvideValueOfKind, strings::CsrStr, IntoStaticStrCache,
55
TempStr, ToAsRefStr,
66
};
77

88
use super::{
9-
ReactiveValue, ReactiveValueKind, ReactiveValueState, RenderInitPinned, ReusableRendererOfKind,
9+
ReactiveValue, ReactiveValueKind, ReactiveValueRenderInitPinned, ReactiveValueState,
10+
RenderInitPinned, ReusableRendererOfKind,
1011
};
1112

1213
impl ReactiveValueKind for str {
@@ -48,20 +49,21 @@ impl<Cache: ToAsRefStr, R: FnOnce(TempStr<&str>) -> Out, Out> RenderInitPinned<R
4849
}
4950
}
5051

52+
impl<Cache: ToAsRefStr> ReactiveValueRenderInitPinned<str, State<Cache>> for RenderInit {
53+
type RenderInitPinned<R: FnOnce(<str as ReactiveValueKind>::Value<'_>) -> Out, Out> = Self;
54+
}
55+
5156
/// [`CsrStr`] are non reactive
5257
impl<T: CsrStr> ReactiveValue<str> for T {
5358
type PinnedState = State<T::StaticStrCache>;
5459
type UnpinnedState = State<T::StaticStrCache>;
55-
type PinnedRenderInit<R: FnOnce(<str as ReactiveValueKind>::Value<'_>) -> Out, Out> =
56-
RenderInit;
60+
type PinnedRenderInit = RenderInit;
5761

5862
crate::impl_reactive_value_with_mixed_unpinned!(
5963
type ReactiveValueKind = str;
6064
);
6165

62-
fn pinned_render_init<R: FnOnce(<str as ReactiveValueKind>::Value<'_>) -> Out, Out>(
63-
self,
64-
) -> (Self::PinnedState, Self::PinnedRenderInit<R, Out>) {
66+
fn pinned_render_init(self) -> (Self::PinnedState, Self::PinnedRenderInit) {
6567
(
6668
State(self.into_into_static_str_cache().into_static_str_cache()),
6769
RenderInit,

packages/frender-common/src/reactive_value/simple_non_reactive.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
use std::{marker::PhantomData, task::Poll};
1+
use std::task::Poll;
22

33
use frender_macro_rules::impl_many;
44

55
use crate::{csr::StateUnmount, reactive_value::ProvideValueOfKind};
66

7-
use super::{ReactiveValue, ReactiveValueKind, ReactiveValueState, RenderInitPinned};
7+
use super::{
8+
ReactiveValue, ReactiveValueKind, ReactiveValueRenderInitPinned, ReactiveValueState,
9+
RenderInitPinned,
10+
};
811

912
trait KnownSimpleNonReactive: 'static + Copy + PartialEq {}
1013

@@ -56,8 +59,8 @@ impl<T: KnownSimpleNonReactive> ReactiveValueState for State<T> {
5659

5760
pub struct RenderInit;
5861

59-
impl<T: KnownSimpleNonReactive, R: FnOnce(<T as ReactiveValueKind>::Value<'_>) -> Out, Out>
60-
RenderInitPinned<R, State<T>> for RenderInit
62+
impl<T: KnownSimpleNonReactive, R: FnOnce(T) -> Out, Out> RenderInitPinned<R, State<T>>
63+
for RenderInit
6164
{
6265
type Output = Out;
6366

@@ -66,18 +69,20 @@ impl<T: KnownSimpleNonReactive, R: FnOnce(<T as ReactiveValueKind>::Value<'_>) -
6669
}
6770
}
6871

72+
impl<T: KnownSimpleNonReactive> ReactiveValueRenderInitPinned<T, State<T>> for RenderInit {
73+
type RenderInitPinned<R: FnOnce(<T as ReactiveValueKind>::Value<'_>) -> Out, Out> = Self;
74+
}
75+
6976
impl<T: KnownSimpleNonReactive> ReactiveValue<T> for T {
7077
type PinnedState = State<T>;
71-
type PinnedRenderInit<R: FnOnce(<T as ReactiveValueKind>::Value<'_>) -> Out, Out> = RenderInit;
78+
type PinnedRenderInit = RenderInit;
7279
type UnpinnedState = State<T>;
7380

7481
crate::impl_reactive_value_with_mixed_unpinned!(
7582
type ReactiveValueKind = T;
7683
);
7784

78-
fn pinned_render_init<R: FnOnce(<T as ReactiveValueKind>::Value<'_>) -> Out, Out>(
79-
self,
80-
) -> (Self::PinnedState, Self::PinnedRenderInit<R, Out>) {
85+
fn pinned_render_init(self) -> (Self::PinnedState, Self::PinnedRenderInit) {
8186
(State(self), RenderInit)
8287
}
8388

packages/frender-dom/src/string_element/reactive_value.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use std::task::Poll;
22

33
use frender_common::reactive_value::{
4-
ProvideValueOfKind, ReactiveValue, ReactiveValueKind, ReactiveValueState, RenderInitPinned,
4+
ProvideValueOfKind, ReactiveValue, ReactiveValueKind, ReactiveValueRenderInitPinned,
5+
ReactiveValueState, RenderInitPinned,
56
};
67
use frender_csr::StateUnmount;
78

@@ -39,22 +40,21 @@ impl<R: FnOnce(&StringElement) -> Out, Out> RenderInitPinned<R, State> for Rende
3940
}
4041
}
4142

43+
impl ReactiveValueRenderInitPinned<StringElement, State> for RenderInit {
44+
type RenderInitPinned<R: FnOnce(<StringElement as ReactiveValueKind>::Value<'_>) -> Out, Out> =
45+
Self;
46+
}
47+
4248
impl ReactiveValue<StringElement> for StringElement {
4349
type UnpinnedState = State;
4450
type PinnedState = State;
45-
type PinnedRenderInit<R: FnOnce(<StringElement as ReactiveValueKind>::Value<'_>) -> Out, Out> =
46-
RenderInit;
51+
type PinnedRenderInit = RenderInit;
4752

4853
frender_common::impl_reactive_value_with_mixed_unpinned!(
4954
type ReactiveValueKind = StringElement;
5055
);
5156

52-
fn pinned_render_init<
53-
R: FnOnce(<StringElement as ReactiveValueKind>::Value<'_>) -> Out,
54-
Out,
55-
>(
56-
self,
57-
) -> (Self::PinnedState, Self::PinnedRenderInit<R, Out>) {
57+
fn pinned_render_init(self) -> (Self::PinnedState, Self::PinnedRenderInit) {
5858
(State(self), RenderInit)
5959
}
6060

packages/frender-html/src/element.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,17 +128,17 @@ pub trait CsrElement {
128128
#[macro_export]
129129
macro_rules! proxy_csr_element {
130130
(|$this:pat_param| $expr:expr) => {
131-
fn pinned_render_init<TCsrElementRenderer: ?::core::marker::Sized + $crate::RenderHtml>(
131+
fn pinned_render_init<Ctx: ?::core::marker::Sized + $crate::HtmlRenderContext>(
132132
//
133133
self,
134-
renderer: &mut TCsrElementRenderer,
134+
render_context: &mut Ctx,
135135
) -> (
136136
//
137-
$crate::__private::PinnedStateOfKind<TCsrElementRenderer, Self::RenderStateKind>,
138-
Self::PinnedRenderInit<TCsrElementRenderer>,
137+
$crate::__private::PinnedStateOfKind<Ctx::Renderer, Self::RenderStateKind>,
138+
Self::PinnedRenderInit<Ctx::Renderer>,
139139
) {
140140
let $this = self;
141-
$expr.pinned_render_init(renderer)
141+
$expr.pinned_render_init(render_context)
142142
}
143143

144144
fn pinned_render_init_by_reusing<Ctx: ?Sized + $crate::HtmlRenderContext>(

packages/frender-html/src/elements/array.rs

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use std::{pin::Pin, task::Poll};
22

33
use frender_common::utils::pin_project_iter_mut_array;
4-
use frender_dom::render::RenderWithContext;
54

65
use crate::{
7-
element::{self, CsrElementRenderInitPinned, PinnedRenderInitKind, PinnedRenderStateKind, PinnedRenderStateKindPollRender, UnpinnedRenderStateKind, UnpinnedRenderStateKindPollRender},
6+
element::{self, PinnedRenderStateKind, PinnedRenderStateKindPollRender, UnpinnedRenderStateKind, UnpinnedRenderStateKindPollRender},
87
CsrElement, HtmlRenderContext, RenderHtml,
98
};
109

@@ -39,22 +38,6 @@ impl<K: PinnedRenderStateKind, const N: usize> PinnedRenderStateKind for Kind<K,
3938
type PinnedUiHandle<R: RenderHtml + ?Sized> = [K::PinnedUiHandle<R>; N];
4039
type PinnedState<R: RenderHtml + ?Sized> = [K::PinnedState<R>; N];
4140
}
42-
impl<K: PinnedRenderInitKind, const N: usize> PinnedRenderInitKind for Kind<K, N> {
43-
type PinnedRenderStateKind = Kind<K::PinnedRenderStateKind, N>;
44-
type PinnedRenderInit<R: RenderHtml + ?Sized> = [K::PinnedRenderInit<R>; N];
45-
}
46-
47-
impl<T: CsrElementRenderInitPinned<R>, const N: usize, R: ?Sized + RenderWithContext> CsrElementRenderInitPinned<R> for [T; N] {
48-
type UiHandle = [T::UiHandle; N];
49-
type State = [T::State; N];
50-
51-
fn render_init_pinned(self, render_context: &mut R::RenderContext<'_>, state: Pin<&mut Self::State>) -> Self::UiHandle {
52-
let mut state = pin_project_iter_mut_array(state);
53-
// This relies on a documented feature of <[_; N]>::map():
54-
// > ..., with function f applied to each element in order
55-
self.map(|this| this.render_init_pinned(render_context, state.next().unwrap()))
56-
}
57-
}
5841

5942
impl<K: PinnedRenderStateKindPollRender, const N: usize> PinnedRenderStateKindPollRender for Kind<K, N> {
6043
fn pinned_poll_render<R: RenderHtml + ?Sized>(
@@ -77,23 +60,23 @@ impl<K: PinnedRenderStateKindPollRender, const N: usize> PinnedRenderStateKindPo
7760

7861
impl<E: CsrElement, const N: usize> CsrElement for [E; N] {
7962
type RenderStateKind = Kind<E::RenderStateKind, N>;
80-
type RenderInitKind = Kind<E::RenderInitKind, N>;
63+
type PinnedRenderInit<R: ?Sized + RenderHtml> = [E::PinnedRenderInit<R>; N];
8164

82-
fn pinned_render_init<Renderer: ?Sized + RenderHtml>(
65+
fn pinned_render_init<Ctx: ?Sized + HtmlRenderContext>(
8366
//
8467
self,
85-
renderer: &mut Renderer,
68+
render_context: &mut Ctx,
8669
) -> (
8770
//
88-
element::PinnedStateOfKind<Renderer, Self::RenderStateKind>,
89-
element::PinnedRenderInitOfKind<Renderer, Self::RenderInitKind>,
71+
element::PinnedStateOfKind<Ctx::Renderer, Self::RenderStateKind>,
72+
Self::PinnedRenderInit<Ctx::Renderer>,
9073
) {
9174
use arrayvec::ArrayVec;
9275

9376
let (states, render_inits) = self
9477
.into_iter()
9578
//
96-
.map(|el| el.pinned_render_init(renderer))
79+
.map(|el| el.pinned_render_init(render_context))
9780
.unzip::<_, _, ArrayVec<_, N>, ArrayVec<_, N>>();
9881

9982
let (

packages/frender-html/src/elements/boxed.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::CsrElement;
22

33
impl<E: CsrElement> CsrElement for Box<E> {
44
type RenderStateKind = E::RenderStateKind;
5-
type RenderInitKind = E::RenderInitKind;
5+
type PinnedRenderInit<R: ?Sized + crate::RenderHtml> = E::PinnedRenderInit<R>;
66

77
crate::proxy_csr_element!(|this| *this);
88
}

0 commit comments

Comments
 (0)