Skip to content

Commit 9cf82b5

Browse files
committed
wip: redesign csr
1 parent af7575b commit 9cf82b5

File tree

2 files changed

+89
-39
lines changed

2 files changed

+89
-39
lines changed
Lines changed: 72 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
use std::pin::Pin;
22
use std::task::Poll;
33

4+
use frender_common::convert::FromMut as _;
45
use frender_dom::behaviors::ElementWithChildren;
5-
use frender_dom::ui_handle::UiHandle;
6-
use frender_dom::{RenderStateWithAnyParent, RenderStateWithParentElementsHandle, StateUnmount};
76

8-
use crate::element::{PinMutRenderInitStatesOfKind, PinnedMutRenderStatesOfKind, PinnedRenderStateKind, PinnedUiHandleOfKind, UnpinnedMutRenderStatesOfKind, UnpinnedRenderStateKind, UnpinnedRenderStatesOfKind};
7+
use crate::element::{
8+
PinMutRenderInitStatesOfKind, PinnedMutRenderStatesOfKind, PinnedRenderStateKind, PinnedRenderStateKindPollRender, PinnedUiHandleOfKind, UnpinnedMutRenderStatesOfKind, UnpinnedRenderStateKind,
9+
UnpinnedRenderStateKindPollRender, UnpinnedRenderStatesOfKind,
10+
};
911
use crate::{BehaviorType, RenderHtml};
1012

1113
use crate::html::behavior_type_traits;
@@ -31,15 +33,15 @@ pub trait RenderStateKindPollRenderWithParent<ParentType: ?Sized + BehaviorType>
3133
) -> Poll<()>;
3234
}
3335

34-
pub trait CsrComponent<Children>: behavior_type_traits::Element {
36+
pub trait CsrComponent<Children>: BehaviorType {
3537
type ChildrenRenderStateKind: RenderStateKindPollRenderWithParent<Self>;
3638

3739
fn children_pinned_render_init<R: RenderHtml + ?Sized>(
3840
//
3941
self,
4042
children: Children,
4143
renderer: &mut R,
42-
parent: &mut Self::Element<R>,
44+
parent: &mut Self::OfBehaviorType<R>,
4345
children_states: PinMutRenderInitStatesOfKind<Self::ChildrenRenderStateKind, R>,
4446
) -> PinnedUiHandleOfKind<R, Self::ChildrenRenderStateKind>;
4547

@@ -48,7 +50,7 @@ pub trait CsrComponent<Children>: behavior_type_traits::Element {
4850
self,
4951
children: Children,
5052
renderer: &mut R,
51-
parent: &mut Self::Element<R>,
53+
parent: &mut Self::OfBehaviorType<R>,
5254
children_states: PinnedMutRenderStatesOfKind<Self::ChildrenRenderStateKind, R>,
5355
);
5456

@@ -57,52 +59,99 @@ pub trait CsrComponent<Children>: behavior_type_traits::Element {
5759
self,
5860
children: Children,
5961
renderer: &mut R,
60-
parent: &mut Self::Element<R>,
62+
parent: &mut Self::OfBehaviorType<R>,
6163
) -> UnpinnedRenderStatesOfKind<Self::ChildrenRenderStateKind, R>;
6264

6365
fn children_unpinned_render_update<R: RenderHtml + ?Sized>(
6466
//
6567
self,
6668
children: Children,
6769
renderer: &mut R,
68-
parent: &mut Self::Element<R>,
70+
parent: &mut Self::OfBehaviorType<R>,
6971
children_states: UnpinnedMutRenderStatesOfKind<Self::ChildrenRenderStateKind, R>,
7072
);
7173
}
7274

73-
#[cfg(todo)]
7475
enum Never {}
7576

76-
#[cfg(todo)]
77-
pub struct KindRenderStateWithAnyParent<K: crate::RenderStateKind>(Never, std::marker::PhantomData<K>);
77+
pub struct KindRenderStateWithAnyParent<CK: UnpinnedRenderStateKind + PinnedRenderStateKind>(Never, std::marker::PhantomData<CK>);
7878

79-
#[cfg(todo)]
80-
impl<K: crate::RenderStateKind, ElType: ?Sized + behavior_type_traits::Element> RenderStateWithPehKind<ElType> for KindRenderStateWithAnyParent<K> {
81-
type RenderStateWithPeh<R: RenderHtml + ?Sized> = RenderStateWithAnyParent<<K as crate::RenderStateKind>::RenderStatePinned<R>>;
82-
type RenderStateWithPehUnpinned<R: RenderHtml + ?Sized> = RenderStateWithAnyParent<<K as crate::RenderStateKind>::RenderStateUnpinned<R>>;
79+
impl<CK: UnpinnedRenderStateKind + PinnedRenderStateKind> UnpinnedRenderStateKind for KindRenderStateWithAnyParent<CK> {
80+
type UnpinnedUiHandle<R: RenderHtml + ?Sized> = CK::UnpinnedUiHandle<R>;
81+
type UnpinnedNonReactiveState<R: RenderHtml + ?Sized> = CK::UnpinnedNonReactiveState<R>;
82+
type UnpinnedReactiveState = CK::UnpinnedReactiveState;
83+
}
84+
85+
impl<CK: UnpinnedRenderStateKind + PinnedRenderStateKind> PinnedRenderStateKind for KindRenderStateWithAnyParent<CK> {
86+
type PinnedUiHandle<R: RenderHtml + ?Sized> = CK::PinnedUiHandle<R>;
87+
type PinnedNonReactiveState<R: RenderHtml + ?Sized> = CK::PinnedNonReactiveState<R>;
88+
type PinnedReactiveState = CK::PinnedReactiveState;
89+
}
90+
91+
impl<CK: UnpinnedRenderStateKindPollRender + PinnedRenderStateKindPollRender, ElType: ?Sized + behavior_type_traits::Element> RenderStateKindPollRenderWithParent<ElType> for KindRenderStateWithAnyParent<CK> {
92+
fn pinned_poll_render_with_parent<R: RenderHtml + ?Sized>(
93+
//
94+
renderer: &mut R,
95+
_: &mut <ElType as BehaviorType>::OfBehaviorType<R>,
96+
states: PinnedMutRenderStatesOfKind<Self, R>,
97+
cx: &mut std::task::Context<'_>,
98+
) -> Poll<()> {
99+
CK::pinned_poll_render(renderer, states, cx)
100+
}
101+
fn unpinned_poll_render_with_parent<R: RenderHtml + ?Sized>(
102+
//
103+
renderer: &mut R,
104+
_: &mut <ElType as BehaviorType>::OfBehaviorType<R>,
105+
states: UnpinnedMutRenderStatesOfKind<Self, R>,
106+
cx: &mut std::task::Context<'_>,
107+
) -> Poll<()> {
108+
CK::unpinned_poll_render(renderer, states, cx)
109+
}
83110
}
84111

85-
#[cfg(todo)]
86112
impl<C: CsrComponentNormalElement, Children: Element> CsrComponent<Children> for C {
87113
type ChildrenRenderStateKind = KindRenderStateWithAnyParent<Children::RenderStateKind>;
88114

89-
fn children_render_update<R: RenderHtml + ?Sized>(
115+
fn children_pinned_render_init<R: RenderHtml + ?Sized>(
116+
//
117+
self,
118+
children: Children,
119+
renderer: &mut R,
120+
parent: &mut Self::OfBehaviorType<R>,
121+
children_states: PinMutRenderInitStatesOfKind<Self::ChildrenRenderStateKind, R>,
122+
) -> PinnedUiHandleOfKind<R, Self::ChildrenRenderStateKind> {
123+
<C::Element<R>>::from_mut(parent).with_render_context_at_first_child_of_self(renderer, |render_context| children.pinned_render_init(render_context, children_states))
124+
}
125+
126+
fn children_pinned_render_update<R: RenderHtml + ?Sized>(
127+
//
90128
self,
91129
children: Children,
92-
element: &mut Self::Element<R>,
93130
renderer: &mut R,
94-
children_state: std::pin::Pin<&mut <Self::ChildrenRenderStateKind as RenderStateWithPehKind<Self>>::RenderStateWithPeh<R>>,
131+
parent: &mut Self::OfBehaviorType<R>,
132+
children_states: PinnedMutRenderStatesOfKind<Self::ChildrenRenderStateKind, R>,
95133
) {
96-
element.with_render_context_at_first_child_of_self(renderer, |renderer| Children::render_update(children, renderer, children_state.as_pin_mut()))
134+
<C::Element<R>>::from_mut(parent).with_render_context_at_first_child_of_self(renderer, |render_context| children.pinned_render_update(render_context, children_states))
135+
}
136+
137+
fn children_unpinned_render_init<R: RenderHtml + ?Sized>(
138+
//
139+
self,
140+
children: Children,
141+
renderer: &mut R,
142+
parent: &mut Self::OfBehaviorType<R>,
143+
) -> UnpinnedRenderStatesOfKind<Self::ChildrenRenderStateKind, R> {
144+
<C::Element<R>>::from_mut(parent).with_render_context_at_first_child_of_self(renderer, |render_context| children.unpinned_render_init(render_context))
97145
}
98146

99147
fn children_unpinned_render_update<R: RenderHtml + ?Sized>(
148+
//
100149
self,
101150
children: Children,
102-
element: &mut Self::Element<R>,
103151
renderer: &mut R,
104-
children_state: &mut <Self::ChildrenRenderStateKind as RenderStateWithPehKind<Self>>::RenderStateWithPehUnpinned<R>,
152+
parent: &mut Self::OfBehaviorType<R>,
153+
children_states: UnpinnedMutRenderStatesOfKind<Self::ChildrenRenderStateKind, R>,
105154
) {
106-
element.with_render_context_at_first_child_of_self(renderer, |renderer| Children::unpinned_render_update(children, renderer, &mut children_state.render_state))
155+
<C::Element<R>>::from_mut(parent).with_render_context_at_first_child_of_self(renderer, |render_context| children.unpinned_render_update(render_context, children_states))
107156
}
108157
}

packages/frender-html/src/intrinsic/csr.rs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -257,16 +257,16 @@ where
257257

258258
let renderer = render_context.renderer_mut();
259259
let parent_attributes;
260+
let parent_b: &mut BT::OfBehaviorType<Ctx::Renderer> = parent.into_mut();
260261
{
261-
let parent: &mut BT::OfBehaviorType<Ctx::Renderer> = parent.into_mut();
262-
parent_attributes = Attrs::unpinned_render_init_with_behavior(attributes, renderer, parent);
263-
AttrsWithPinnedState::pinned_render_init_with_behavior(attributes_with_pinned_state, renderer, parent, parent_attributes_pinned_state);
262+
parent_attributes = Attrs::unpinned_render_init_with_behavior(attributes, renderer, parent_b);
263+
AttrsWithPinnedState::pinned_render_init_with_behavior(attributes_with_pinned_state, renderer, parent_b, parent_attributes_pinned_state);
264264
}
265265

266266
let children_ui_handle = type_marker.children_pinned_render_init(
267267
children,
268268
renderer,
269-
&mut parent,
269+
parent_b,
270270
PinMutRenderInitStates {
271271
non_reactive_state: children_non_reactive_state,
272272
reactive_state,
@@ -309,17 +309,17 @@ where
309309
let parent_attributes_pinned_state = non_reactive_state.parent_attributes;
310310

311311
let renderer = render_context.renderer_mut();
312+
let parent_b: &mut BT::OfBehaviorType<Ctx::Renderer> = parent.into_mut();
312313

313314
{
314-
let parent: &mut BT::OfBehaviorType<Ctx::Renderer> = parent.into_mut();
315-
Attrs::unpinned_render_update_with_behavior(attributes, renderer, parent, parent_attributes);
316-
AttrsWithPinnedState::pinned_render_init_with_behavior(attributes_with_pinned_state, renderer, parent, parent_attributes_pinned_state);
315+
Attrs::unpinned_render_update_with_behavior(attributes, renderer, parent_b, parent_attributes);
316+
AttrsWithPinnedState::pinned_render_init_with_behavior(attributes_with_pinned_state, renderer, parent_b, parent_attributes_pinned_state);
317317
}
318318

319319
type_marker.children_pinned_render_update(
320320
children,
321321
renderer,
322-
parent,
322+
parent_b,
323323
RenderStates {
324324
ui_handle: children_ui_handle,
325325
non_reactive_state: children_non_reactive_state,
@@ -344,15 +344,16 @@ where
344344
let mut parent: BT::Element<Ctx::Renderer> = From::from(parent);
345345

346346
let renderer = render_context.renderer_mut();
347+
let parent_b: &mut BT::OfBehaviorType<Ctx::Renderer> = parent.into_mut();
348+
347349
let parent_attributes = {
348-
let parent: &mut BT::OfBehaviorType<Ctx::Renderer> = parent.into_mut();
349350
(
350-
Attrs::unpinned_render_init_with_behavior(attributes, renderer, parent),
351-
AttrsWithPinnedState::unpinned_render_init_with_behavior(attributes_with_pinned_state, renderer, parent),
351+
Attrs::unpinned_render_init_with_behavior(attributes, renderer, parent_b),
352+
AttrsWithPinnedState::unpinned_render_init_with_behavior(attributes_with_pinned_state, renderer, parent_b),
352353
)
353354
};
354355

355-
let children_states = type_marker.children_unpinned_render_init(children, renderer, &mut parent);
356+
let children_states = type_marker.children_unpinned_render_init(children, renderer, parent_b);
356357

357358
RenderStates {
358359
ui_handle: ParentWithChildren {
@@ -395,17 +396,17 @@ where
395396
} = states;
396397

397398
let renderer = render_context.renderer_mut();
399+
let parent_b: &mut BT::OfBehaviorType<Ctx::Renderer> = parent.into_mut();
398400

399401
{
400-
let parent: &mut BT::OfBehaviorType<Ctx::Renderer> = parent.into_mut();
401-
Attrs::unpinned_render_update_with_behavior(attributes, renderer, parent, parent_attributes);
402-
AttrsWithPinnedState::unpinned_render_update_with_behavior(attributes_with_pinned_state, renderer, parent, parent_attributes_pinned);
402+
Attrs::unpinned_render_update_with_behavior(attributes, renderer, parent_b, parent_attributes);
403+
AttrsWithPinnedState::unpinned_render_update_with_behavior(attributes_with_pinned_state, renderer, parent_b, parent_attributes_pinned);
403404
}
404405

405406
type_marker.children_unpinned_render_update(
406407
children,
407408
renderer,
408-
parent,
409+
parent_b,
409410
RenderStates {
410411
ui_handle: children_ui_handle,
411412
non_reactive_state: children_non_reactive_state,

0 commit comments

Comments
 (0)