11use async_str_iter:: either:: IterEither ;
2- use frender_common :: either :: EitherState ;
2+ use csr :: State ;
33use frender_const:: { ConstUsize , KnownConstUsizeAdd } ;
44
55use crate :: {
66 constness:: { HasConstKnownPossibleDomTokens , IsConstUsize } ,
77 dom_token:: UniqueDomTokenArrayVec ,
8- ChainableDomTokens , DomTokens ,
8+ ChainableDomTokens , DomTokens , DomTokensStateUnmount ,
99} ;
1010
1111#[ derive( Debug , Clone , Copy ) ]
@@ -14,47 +14,87 @@ pub enum EitherDomTokens<A, B> {
1414 B ( B ) ,
1515}
1616
17+ pub mod csr {
18+ use crate :: DomTokensStateUnmount ;
19+
20+ pub enum State < A , B > {
21+ A ( A ) ,
22+ B ( B ) ,
23+ }
24+
25+ impl < A : DomTokensStateUnmount , B : DomTokensStateUnmount > DomTokensStateUnmount for State < A , B > {
26+ fn dom_tokens_state_unmount (
27+ state : & mut Self ,
28+ dom_token_list : & mut impl crate :: DomTokenList ,
29+ ) {
30+ match state {
31+ State :: A ( state) => A :: dom_tokens_state_unmount ( state, dom_token_list) ,
32+ State :: B ( state) => B :: dom_tokens_state_unmount ( state, dom_token_list) ,
33+ }
34+ }
35+ }
36+ }
37+
1738impl < L : DomTokens , R : DomTokens > DomTokens for EitherDomTokens < L , R > {
18- type UpdateWithState = EitherState < L :: UpdateWithState , R :: UpdateWithState > ;
39+ type State = State < L :: State , R :: State > ;
40+
41+ fn dom_tokens_render_init (
42+ this : Self ,
43+ dom_token_list : & mut impl crate :: DomTokenList ,
44+ ) -> Self :: State {
45+ match this {
46+ EitherDomTokens :: A ( this) => State :: A ( L :: dom_tokens_render_init ( this, dom_token_list) ) ,
47+ EitherDomTokens :: B ( this) => State :: B ( R :: dom_tokens_render_init ( this, dom_token_list) ) ,
48+ }
49+ }
1950
20- fn update_with_state (
51+ fn dom_tokens_render_init_with_old_state (
2152 this : Self ,
2253 dom_token_list : & mut impl crate :: DomTokenList ,
23- state : & mut Self :: UpdateWithState ,
54+ old_state : & mut Self :: State ,
2455 ) {
2556 match this {
26- EitherDomTokens :: A ( this) => {
27- let state = match state {
28- EitherState :: Left { inner : state } => state,
29- EitherState :: Right { inner : old_state } => {
30- R :: remove_with_state ( dom_token_list, old_state) ;
31- state. get_left_or_insert_default ( )
32- }
33- } ;
34-
35- L :: update_with_state ( this, dom_token_list, state)
36- }
37- EitherDomTokens :: B ( this) => {
38- let state = match state {
39- EitherState :: Right { inner : state } => state,
40- EitherState :: Left { inner : old_state } => {
41- L :: remove_with_state ( dom_token_list, old_state) ;
42- state. get_right_or_insert_default ( )
43- }
44- } ;
45-
46- R :: update_with_state ( this, dom_token_list, state)
47- }
57+ EitherDomTokens :: A ( this) => match old_state {
58+ State :: A ( old_state) => {
59+ L :: dom_tokens_render_init_with_old_state ( this, dom_token_list, old_state)
60+ }
61+ State :: B ( _) => {
62+ // Already unmounted
63+ * old_state = State :: A ( L :: dom_tokens_render_init ( this, dom_token_list) )
64+ }
65+ } ,
66+ EitherDomTokens :: B ( this) => match old_state {
67+ State :: B ( old_state) => {
68+ R :: dom_tokens_render_init_with_old_state ( this, dom_token_list, old_state)
69+ }
70+ State :: A ( _) => {
71+ // Already unmounted
72+ * old_state = State :: B ( R :: dom_tokens_render_init ( this, dom_token_list) )
73+ }
74+ } ,
4875 }
4976 }
5077
51- fn remove_with_state (
78+ fn dom_tokens_render_update (
79+ this : Self ,
5280 dom_token_list : & mut impl crate :: DomTokenList ,
53- state : & mut Self :: UpdateWithState ,
81+ state : & mut Self :: State ,
5482 ) {
55- match state {
56- EitherState :: Left { inner : state } => L :: remove_with_state ( dom_token_list, state) ,
57- EitherState :: Right { inner : state } => R :: remove_with_state ( dom_token_list, state) ,
83+ match this {
84+ EitherDomTokens :: A ( this) => match state {
85+ State :: A ( state) => L :: dom_tokens_render_update ( this, dom_token_list, state) ,
86+ State :: B ( old_state) => {
87+ <R :: State >:: dom_tokens_state_unmount ( old_state, dom_token_list) ;
88+ * state = State :: A ( L :: dom_tokens_render_init ( this, dom_token_list) )
89+ }
90+ } ,
91+ EitherDomTokens :: B ( this) => match state {
92+ State :: B ( state) => R :: dom_tokens_render_update ( this, dom_token_list, state) ,
93+ State :: A ( old_state) => {
94+ <L :: State >:: dom_tokens_state_unmount ( old_state, dom_token_list) ;
95+ * state = State :: B ( R :: dom_tokens_render_init ( this, dom_token_list) )
96+ }
97+ } ,
5898 }
5999 }
60100
0 commit comments