Skip to content

Commit 3c5d386

Browse files
committed
wip: redesign pinned_render_init, will redesign RenderInitPinned
1 parent 9bd2049 commit 3c5d386

File tree

15 files changed

+183
-74
lines changed

15 files changed

+183
-74
lines changed

packages/frender-html/src/element.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ pub trait PinnedRenderStateKind {
2626
type PinnedState<R: RenderHtml + ?Sized>: StateUnmount;
2727
}
2828

29-
pub trait PinnedRenderInitKind: PinnedRenderStateKind {
29+
pub trait PinnedRenderInitKind {
30+
type PinnedRenderStateKind: PinnedRenderStateKind;
3031
type PinnedRenderInit<R: RenderHtml + ?Sized>: CsrElementRenderInitPinned<
3132
//
3233
R,
33-
UiHandle = Self::PinnedUiHandle<R>,
34-
State = Self::PinnedState<R>,
34+
UiHandle = PinnedUiHandleOfKind<R, Self::PinnedRenderStateKind>,
35+
State = PinnedStateOfKind<R, Self::PinnedRenderStateKind>,
3536
>;
3637
}
3738

@@ -68,8 +69,8 @@ pub trait UnpinnedRenderStateKindPollRender: UnpinnedRenderStateKind {
6869
}
6970

7071
/// Trait alias for experimental traits.
71-
pub trait RenderStateKind: UnpinnedRenderStateKindPollRender + PinnedRenderStateKindPollRender + PinnedRenderInitKind {}
72-
impl<K: ?Sized + UnpinnedRenderStateKindPollRender + PinnedRenderStateKindPollRender + PinnedRenderInitKind> RenderStateKind for K {}
72+
pub trait RenderStateKind: UnpinnedRenderStateKindPollRender + PinnedRenderStateKindPollRender {}
73+
impl<K: ?Sized + UnpinnedRenderStateKindPollRender + PinnedRenderStateKindPollRender> RenderStateKind for K {}
7374

7475
pub type PinnedUiHandleOfKind<R, K> = <K as PinnedRenderStateKind>::PinnedUiHandle<R>;
7576
pub type PinnedRenderInitOfKind<R, K> = <K as PinnedRenderInitKind>::PinnedRenderInit<R>;
@@ -82,6 +83,7 @@ pub type UnpinnedStateOfKind<R, K> = <K as UnpinnedRenderStateKind>::UnpinnedSta
8283

8384
pub trait CsrElement {
8485
type RenderStateKind: RenderStateKind;
86+
type RenderInitKind: PinnedRenderInitKind<PinnedRenderStateKind = Self::RenderStateKind>;
8587

8688
/// The implementation should _initialize_ `state_default` so that [`AsOptionMut::<PinnedState>::as_option_mut(state_default).is_some()`](AsOptionMut)
8789
/// or future usage will panic.
@@ -93,7 +95,7 @@ pub trait CsrElement {
9395
) -> (
9496
//
9597
PinnedStateOfKind<Renderer, Self::RenderStateKind>,
96-
PinnedRenderInitOfKind<Renderer, Self::RenderStateKind>,
98+
PinnedRenderInitOfKind<Renderer, Self::RenderInitKind>,
9799
);
98100

99101
fn pinned_render_init_by_reusing<Ctx: ?Sized + HtmlRenderContext>(
@@ -146,7 +148,7 @@ macro_rules! proxy_csr_element {
146148
renderer: &mut Renderer,
147149
) -> (
148150
$crate::__private::PinnedStateOfKind<Renderer, Self::RenderStateKind>,
149-
$crate::__private::PinnedRenderInitOfKind<Renderer, Self::RenderStateKind>,
151+
$crate::__private::PinnedRenderInitOfKind<Renderer, Self::RenderInitKind>,
150152
) {
151153
let $this = self;
152154
$expr.pinned_render_init(renderer)

packages/frender-html/src/element_types.rs

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1+
use std::marker::PhantomData;
12
use std::pin::Pin;
23
use std::task::Poll;
34

45
use frender_common::convert::FromMut as _;
56
use frender_dom::behaviors::ElementWithChildren;
7+
use frender_dom::render::RenderWithContext;
68

79
use crate::element::{
8-
PinnedRenderInitKind, PinnedRenderStateKind, PinnedStateOfKind, PinnedUiHandleOfKind, PinnedUnmountedUiHandleOfKind, RenderStateKind, UnpinnedRenderStateKind, UnpinnedStateOfKind, UnpinnedUiHandleOfKind,
9-
UnpinnedUnmountedUiHandleOfKind,
10+
CsrElementRenderInitPinned, PinnedRenderInitKind, PinnedRenderStateKind, PinnedStateOfKind, PinnedUiHandleOfKind, PinnedUnmountedUiHandleOfKind, RenderStateKind, UnpinnedRenderStateKind, UnpinnedStateOfKind,
11+
UnpinnedUiHandleOfKind, UnpinnedUnmountedUiHandleOfKind,
1012
};
1113
use crate::{BehaviorType, RenderHtml};
1214

@@ -35,23 +37,31 @@ pub trait RenderStateKindPollRenderWithParent<ParentType: ?Sized + BehaviorType>
3537
) -> Poll<()>;
3638
}
3739

38-
pub trait RenderInitWithParent<ParentType: ?Sized + BehaviorType, R: ?Sized + RenderHtml> {
39-
type PinnedRenderStateKind: PinnedRenderStateKind;
40+
pub trait RenderInitPinnedWithParent<ParentType: ?Sized + BehaviorType, R: ?Sized + RenderHtml> {
41+
type UiHandle;
42+
type State;
4043
fn render_init_pinned_with_parent(
4144
//
4245
self,
4346
renderer: &mut R,
4447
parent: &mut ParentType::OfBehaviorType<R>,
45-
children_state: Pin<&mut PinnedStateOfKind<R, Self::PinnedRenderStateKind>>,
46-
);
48+
children_state: Pin<&mut Self::State>,
49+
) -> Self::UiHandle;
4750
}
4851

4952
pub trait PinnedRenderInitKindWithParent<ParentType: ?Sized + BehaviorType> {
50-
type PinnedRenderInitWithParent<R: ?Sized + RenderHtml>: RenderInitWithParent<ParentType, R>;
53+
type PinnedRenderStateKind: PinnedRenderStateKind;
54+
type PinnedRenderInitWithParent<R: ?Sized + RenderHtml>: RenderInitPinnedWithParent<
55+
ParentType,
56+
R,
57+
UiHandle = PinnedUiHandleOfKind<R, Self::PinnedRenderStateKind>,
58+
State = PinnedStateOfKind<R, Self::PinnedRenderStateKind>,
59+
>;
5160
}
5261

5362
pub trait CsrComponent<Children>: BehaviorType {
54-
type ChildrenRenderStateKind: RenderStateKindPollRenderWithParent<Self> + PinnedRenderInitKindWithParent<Self>;
63+
type ChildrenRenderStateKind: RenderStateKindPollRenderWithParent<Self>;
64+
type ChildrenRenderInitKind: PinnedRenderInitKindWithParent<Self>;
5565

5666
fn children_pinned_render_init<R: RenderHtml + ?Sized>(
5767
//
@@ -60,7 +70,7 @@ pub trait CsrComponent<Children>: BehaviorType {
6070
renderer: &mut R,
6171
) -> (
6272
PinnedStateOfKind<R, Self::ChildrenRenderStateKind>,
63-
<Self::ChildrenRenderStateKind as PinnedRenderInitKindWithParent<Self>>::PinnedRenderInitWithParent<R>,
73+
<Self::ChildrenRenderInitKind as PinnedRenderInitKindWithParent<Self>>::PinnedRenderInitWithParent<R>,
6474
);
6575

6676
fn children_pinned_render_init_by_reusing<R: RenderHtml + ?Sized>(
@@ -118,14 +128,15 @@ pub trait CsrComponent<Children>: BehaviorType {
118128

119129
enum Never {}
120130

121-
pub struct KindRenderStateWithAnyParent<CK>(Never, std::marker::PhantomData<CK>);
131+
pub struct StateKindWithAnyParent<CK>(Never, PhantomData<CK>);
132+
pub struct InitKindWithAnyParent<CK>(Never, PhantomData<CK>);
122133

123-
impl<CK: UnpinnedRenderStateKind> UnpinnedRenderStateKind for KindRenderStateWithAnyParent<CK> {
134+
impl<CK: UnpinnedRenderStateKind> UnpinnedRenderStateKind for StateKindWithAnyParent<CK> {
124135
type UnpinnedUiHandle<R: RenderHtml + ?Sized> = CK::UnpinnedUiHandle<R>;
125136
type UnpinnedState<R: RenderHtml + ?Sized> = CK::UnpinnedState<R>;
126137
}
127138

128-
impl<CK: PinnedRenderStateKind> PinnedRenderStateKind for KindRenderStateWithAnyParent<CK> {
139+
impl<CK: PinnedRenderStateKind> PinnedRenderStateKind for StateKindWithAnyParent<CK> {
129140
type PinnedUiHandle<R: RenderHtml + ?Sized> = CK::PinnedUiHandle<R>;
130141
type PinnedState<R: RenderHtml + ?Sized> = CK::PinnedState<R>;
131142
}
@@ -134,7 +145,7 @@ impl<
134145
//
135146
CK: RenderStateKind,
136147
ElType: ?Sized + behavior_type_traits::Element,
137-
> RenderStateKindPollRenderWithParent<ElType> for KindRenderStateWithAnyParent<CK>
148+
> RenderStateKindPollRenderWithParent<ElType> for StateKindWithAnyParent<CK>
138149
{
139150
fn pinned_poll_render_with_parent<R: RenderHtml + ?Sized>(
140151
//
@@ -159,22 +170,47 @@ impl<
159170
}
160171
}
161172

162-
impl<CK: PinnedRenderInitKind, ElType: ?Sized + behavior_type_traits::Element> PinnedRenderInitKindWithParent for KindRenderStateWithAnyParent<CK> {}
173+
impl<CK: PinnedRenderInitKind, ElType: ?Sized + behavior_type_traits::Element> PinnedRenderInitKindWithParent<ElType> for InitKindWithAnyParent<CK> {
174+
type PinnedRenderStateKind = StateKindWithAnyParent<CK::PinnedRenderStateKind>;
175+
type PinnedRenderInitWithParent<R: ?Sized + RenderHtml> = RenderInitWithAnyParent<CK::PinnedRenderInit<R>>;
176+
}
177+
178+
pub struct RenderInitWithAnyParent<T>(T);
163179

164-
pub struct RenderInitWithAnyParent;
180+
impl<T: CsrElementRenderInitPinned<R>, ElType: ?Sized + behavior_type_traits::Element, R: ?Sized + RenderHtml> RenderInitPinnedWithParent<ElType, R> for RenderInitWithAnyParent<T> {
181+
type UiHandle = T::UiHandle;
182+
type State = T::State;
183+
184+
fn render_init_pinned_with_parent(
185+
//
186+
self,
187+
renderer: &mut R,
188+
parent: &mut <ElType as BehaviorType>::OfBehaviorType<R>,
189+
children_state: Pin<&mut Self::State>,
190+
) -> Self::UiHandle {
191+
<ElType::Element<R>>::from_mut(parent).with_render_context_at_first_child_of_self(
192+
//
193+
renderer,
194+
|render_context| self.0.render_init_pinned(render_context, children_state),
195+
)
196+
}
197+
}
165198

166199
impl<C: CsrComponentNormalElement, Children: Element> CsrComponent<Children> for C {
167-
type ChildrenRenderStateKind = KindRenderStateWithAnyParent<Children::RenderStateKind>;
200+
type ChildrenRenderStateKind = StateKindWithAnyParent<Children::RenderStateKind>;
201+
type ChildrenRenderInitKind = InitKindWithAnyParent<Children::RenderInitKind>;
168202

169203
fn children_pinned_render_init<R: RenderHtml + ?Sized>(
170204
//
171205
self,
172206
children: Children,
173207
renderer: &mut R,
174-
parent: &mut Self::OfBehaviorType<R>,
175-
children_state_default: Pin<&mut PinnedStateDefaultOfKind<R, Self::ChildrenRenderStateKind>>,
176-
) -> PinnedUiHandleOfKind<R, Self::ChildrenRenderStateKind> {
177-
<C::Element<R>>::from_mut(parent).with_render_context_at_first_child_of_self(renderer, |render_context| children.pinned_render_init(render_context, children_state_default))
208+
) -> (
209+
PinnedStateOfKind<R, Self::ChildrenRenderStateKind>,
210+
<Self::ChildrenRenderInitKind as PinnedRenderInitKindWithParent<Self>>::PinnedRenderInitWithParent<R>,
211+
) {
212+
let (state, render_init) = children.pinned_render_init(renderer);
213+
(state, RenderInitWithAnyParent(render_init))
178214
}
179215

180216
fn children_pinned_render_init_by_reusing<R: RenderHtml + ?Sized>(

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use frender_common::utils::pin_project_iter_mut_array;
44
use frender_dom::render::RenderWithContext;
55

66
use crate::{
7-
element::{self, CsrElementRenderInitPinned, PinnedRenderStateKind, PinnedRenderStateKindPollRender, PinnedRenderInitKind, UnpinnedRenderStateKind, UnpinnedRenderStateKindPollRender},
7+
element::{self, CsrElementRenderInitPinned, PinnedRenderInitKind, PinnedRenderStateKind, PinnedRenderStateKindPollRender, UnpinnedRenderStateKind, UnpinnedRenderStateKindPollRender},
88
CsrElement, HtmlRenderContext, RenderHtml,
99
};
1010

@@ -40,6 +40,7 @@ impl<K: PinnedRenderStateKind, const N: usize> PinnedRenderStateKind for Kind<K,
4040
type PinnedState<R: RenderHtml + ?Sized> = [K::PinnedState<R>; N];
4141
}
4242
impl<K: PinnedRenderInitKind, const N: usize> PinnedRenderInitKind for Kind<K, N> {
43+
type PinnedRenderStateKind = Kind<K::PinnedRenderStateKind, N>;
4344
type PinnedRenderInit<R: RenderHtml + ?Sized> = [K::PinnedRenderInit<R>; N];
4445
}
4546

@@ -76,6 +77,7 @@ impl<K: PinnedRenderStateKindPollRender, const N: usize> PinnedRenderStateKindPo
7677

7778
impl<E: CsrElement, const N: usize> CsrElement for [E; N] {
7879
type RenderStateKind = Kind<E::RenderStateKind, N>;
80+
type RenderInitKind = Kind<E::RenderInitKind, N>;
7981

8082
fn pinned_render_init<Renderer: ?Sized + RenderHtml>(
8183
//
@@ -84,7 +86,7 @@ impl<E: CsrElement, const N: usize> CsrElement for [E; N] {
8486
) -> (
8587
//
8688
element::PinnedStateOfKind<Renderer, Self::RenderStateKind>,
87-
element::PinnedRenderInitOfKind<Renderer, Self::RenderStateKind>,
89+
element::PinnedRenderInitOfKind<Renderer, Self::RenderInitKind>,
8890
) {
8991
use arrayvec::ArrayVec;
9092

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

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

33
impl<E: CsrElement> CsrElement for Box<E> {
44
type RenderStateKind = E::RenderStateKind;
5+
type RenderInitKind = E::RenderInitKind;
56

67
crate::proxy_csr_element!(|this| *this);
78
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use frender_dom::{
99
use pin_project_lite::pin_project;
1010

1111
use crate::{
12-
element::{CsrElementRenderInitPinned, PinnedRenderStateKind, PinnedRenderStateKindPollRender, PinnedRenderInitKind, UnpinnedRenderStateKind, UnpinnedRenderStateKindPollRender},
12+
element::{CsrElementRenderInitPinned, PinnedRenderInitKind, PinnedRenderStateKind, PinnedRenderStateKindPollRender, UnpinnedRenderStateKind, UnpinnedRenderStateKindPollRender},
1313
ui_handles::EitherUiHandle,
1414
CsrElement, HtmlRenderContext, RenderHtml,
1515
};
@@ -153,6 +153,7 @@ impl<KA: PinnedRenderStateKind, KB: PinnedRenderStateKind> PinnedRenderStateKind
153153
}
154154

155155
impl<KA: PinnedRenderInitKind, KB: PinnedRenderInitKind> PinnedRenderInitKind for Kind<KA, KB> {
156+
type PinnedRenderStateKind = Kind<KA::PinnedRenderStateKind, KB::PinnedRenderStateKind>;
156157
type PinnedRenderInit<R: RenderHtml + ?Sized> = EitherPinnedRenderInit<KA::PinnedRenderInit<R>, KB::PinnedRenderInit<R>>;
157158
}
158159

@@ -188,6 +189,7 @@ impl<KA: PinnedRenderStateKindPollRender, KB: PinnedRenderStateKindPollRender> P
188189

189190
impl<A: CsrElement, B: CsrElement> CsrElement for EitherElement<A, B> {
190191
type RenderStateKind = Kind<A::RenderStateKind, B::RenderStateKind>;
192+
type RenderInitKind = Kind<A::RenderInitKind, B::RenderInitKind>;
191193

192194
fn pinned_render_init<Renderer: ?Sized + RenderHtml>(
193195
//
@@ -196,7 +198,7 @@ impl<A: CsrElement, B: CsrElement> CsrElement for EitherElement<A, B> {
196198
) -> (
197199
//
198200
crate::element::PinnedStateOfKind<Renderer, Self::RenderStateKind>,
199-
crate::element::PinnedRenderInitOfKind<Renderer, Self::RenderStateKind>,
201+
crate::element::PinnedRenderInitOfKind<Renderer, Self::RenderInitKind>,
200202
) {
201203
match self {
202204
EitherElement::A(this) => {

packages/frender-html/src/elements/either/extern_either.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ where
1616
R: CsrElement,
1717
{
1818
type RenderStateKind = super::Kind<L::RenderStateKind, R::RenderStateKind>;
19+
type RenderInitKind = super::Kind<L::RenderInitKind, R::RenderInitKind>;
1920

2021
proxy_csr_element!(|this| into_either_element(this));
2122
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::{
77

88
impl CsrElement for Empty {
99
type RenderStateKind = KindOfNoState;
10+
type RenderInitKind = KindOfNoState;
1011

1112
fn pinned_render_init<Renderer: ?Sized + crate::RenderHtml>(
1213
//

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use frender_dom::{
88
};
99

1010
use crate::{
11-
element::{CsrElementRenderInitPinned, PinnedRenderStateKind, PinnedRenderStateKindPollRender, PinnedRenderInitKind, UnpinnedRenderStateKind, UnpinnedRenderStateKindPollRender},
11+
element::{CsrElementRenderInitPinned, PinnedRenderInitKind, PinnedRenderStateKind, PinnedRenderStateKindPollRender, UnpinnedRenderStateKind, UnpinnedRenderStateKindPollRender},
1212
CsrElement, HtmlRenderContext, RenderHtml,
1313
};
1414

@@ -66,6 +66,7 @@ impl<K: PinnedRenderStateKind> PinnedRenderStateKind for Kind<K> {
6666
}
6767

6868
impl<K: PinnedRenderInitKind> PinnedRenderInitKind for Kind<K> {
69+
type PinnedRenderStateKind = Kind<K::PinnedRenderStateKind>;
6970
type PinnedRenderInit<R: RenderHtml + ?Sized> = OptionPinnedRenderInit<K::PinnedRenderInit<R>>;
7071
}
7172

@@ -89,6 +90,7 @@ impl<K: PinnedRenderStateKindPollRender> PinnedRenderStateKindPollRender for Kin
8990

9091
impl<E: CsrElement> CsrElement for Option<E> {
9192
type RenderStateKind = Kind<E::RenderStateKind>;
93+
type RenderInitKind = Kind<E::RenderInitKind>;
9294

9395
fn pinned_render_init<Renderer: ?Sized + RenderHtml>(
9496
//
@@ -97,7 +99,7 @@ impl<E: CsrElement> CsrElement for Option<E> {
9799
) -> (
98100
//
99101
crate::element::PinnedStateOfKind<Renderer, Self::RenderStateKind>,
100-
crate::element::PinnedRenderInitOfKind<Renderer, Self::RenderStateKind>,
102+
crate::element::PinnedRenderInitOfKind<Renderer, Self::RenderInitKind>,
101103
) {
102104
if let Some(this) = self {
103105
let (state, render_init) = this.pinned_render_init(renderer);

0 commit comments

Comments
 (0)