package Ġio . github . and rew bg m . echo Ċ Ċ import Ġkotlin . math .* Ċ Ċ private Ġclass ĠProjection < N >( ĊĠ Ġval Ġkey : ĠString ?, ĊĠ Ġval Ġtype : ĠTag . Type <* >, ĊĠ Ġvar Ġprops : ĠProps , ĊĠ Ġval Ġparent : ĠProjection < N >? Ġ= Ġnull , ĊĠ Ġval Ġnode : ĠN ? Ġ= Ġnull , Ċ ) Ġ{ ĊĠ Ġvar Ġchildren Ġ= Ġempty List < Projection < N >>() ĊĠ Ġvar Ġhooks Ġ= Ġempty List < Hook >() ĊĊĠ Ġval Ġinner Node : ĠN ? ĊĠĠĠ Ġget () Ġ= Ġnode Ġ?: Ġchildren . first NotNull Of OrNull Ġ{ Ġinner Node Ġ} ĊĊĠ Ġval Ġouter Node : ĠN ? ĊĠĠĠ Ġget () Ġ= Ġnode Ġ?: Ġparent ?. outer Node Ċ } Ċ Ċ private Ġconst Ġval ĠROOT _ TAG _ KEY Ġ= Ġ" ROOT " Ċ Ċ private Ġobject ĠRoot Tag Type Ġ: ĠTag . Type < Props > Ċ Ċ class ĠRe conciler < in ĠT Ġ: ĠTag . Type < P >, Ġin ĠP Ġ: ĠProps , ĠN Ġ: ĠAny >( ĊĠ Ġprivate Ġval Ġproject or : ĠProject or < T , ĠP , ĠN >, Ċ ) Ġ{ ĊĠ Ġprivate Ġval Ġprojection By Root Ġ= Ġmutable Map Of < N , ĠProjection < N >>() ĊĊĠ Ġfun Ġcreate Root ( ĊĠĠĠ Ġnode : ĠN , ĊĠ Ġ): ĠN Ġ{ ĊĠĠĠ Ġrequire ( projection By Root [ node ] Ġ== Ġnull ) ĊĊĠĠĠ Ġprojection By Root [ node ] Ġ= ĠProjection ( ĊĠĠĠĠĠ Ġkey Ġ= ĠROOT _ TAG _ KEY , ĊĠĠĠĠĠ Ġtype Ġ= ĠRoot Tag Type , ĊĠĠĠĠĠ Ġprops Ġ= ĠProps (), ĊĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn Ġnode ĊĠ Ġ} ĊĊĠ Ġfun Ġupdate Root ( ĊĠĠĠ Ġnode : ĠN , ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġprojection Ġ= Ġrequire NotNull ( projection By Root [ node ]) ĊĊĠĠĠ ĠEcho . update Ġ{ ĊĠĠĠĠĠ Ġprojection . children Ġ= Ġre concile Children ( projection , ĠlistOf ( tag )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġre concile Children ( ĊĠĠĠ Ġparent : ĠProjection < N >, ĊĠĠĠ Ġchildren : ĠList < Tag ? >, ĊĠ Ġ): ĠList < Projection < N >> Ġ{ ĊĠĠĠ Ġval Ġnew Projection s Ġ= Ġmutable ListOf < Projection < N >>() ĊĠĠĠ Ġval Ġcount Ġ= Ġmax ( parent . children . size , Ġchildren . size ) ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. count ) Ġ{ ĊĠĠĠĠĠ Ġval Ġprevious Projection Ġ= Ġparent . children . get OrNull ( i ) ĊĠĠĠĠĠ Ġval Ġnext Tag Ġ= Ġchildren . get OrNull ( i ) ĊĊĠĠĠĠĠ Ġif Ġ( previous Projection Ġ== Ġnull Ġ&& Ġnext Tag Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Projection s Ġ+= Ġappend Projection ( parent , Ġnext Tag ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( previous Projection Ġ!= Ġnull Ġ&& Ġnext Tag Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Projection ( previous Projection ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( previous Projection Ġ!= Ġnull Ġ&& Ġnext Tag Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Projection s Ġ+= Ġif Ġ( previous Projection . type Ġ== Ġnext Tag . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġupdate Projection ( previous Projection , Ġnext Tag ) ĊĠĠĠĠĠĠĠĠĠ Ġprevious Projection ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġreplace Projection ( previous Projection , Ġnext Tag ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnew Projection s . toList () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġappend Projection ( ĊĠĠĠ Ġparent : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ): ĠProjection < N > Ġ{ ĊĠĠĠ Ġval Ġnew Projection Ġ= Ġcreate Projection ( parent , Ġtag ) ĊĠĠĠ Ġif Ġ( new Projection . node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġparent Node Ġ= Ġrequire NotNull ( parent . outer Node ) ĊĠĠĠĠĠ Ġproject or . appendChild ( parentNode , Ġnew Projection . node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnew Projection ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġreplace Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ): ĠProjection < N > Ġ{ ĊĠĠĠ Ġval Ġnew Projection Ġ= Ġinsert Projection ( projection , Ġtag ) ĊĠĠĠ Ġremove Projection ( projection ) ĊĠĠĠ Ġreturn Ġnew Projection ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġinsert Projection ( ĊĠĠĠ Ġbefore Projection : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ): ĠProjection < N > Ġ{ ĊĠĠĠ Ġval Ġparent Ġ= Ġrequire NotNull ( before Projection . parent ) ĊĠĠĠ Ġval Ġnew Projection Ġ= Ġcreate Projection ( parent , Ġtag ) ĊĠĠĠ Ġif Ġ( new Projection . node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġparent Node Ġ= Ġrequire NotNull ( parent . outer Node ) ĊĠĠĠĠĠ Ġval Ġbefore Child Node Ġ= Ġrequire NotNull ( before Projection . inner Node ) ĊĠĠĠĠĠ Ġproject or . insert Child ( parentNode , Ġnew Projection . node , Ġbefore Child Node ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnew Projection ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Projection ( ĊĠĠĠ Ġparent : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ): ĠProjection < N > Ġ= Ġwhen Ġ( tag . type ) Ġ{ ĊĠĠĠ Ġis ĠContext Tag Type < *> Ġ-> Ġcreate Context Projection ( parent , Ġtag ) ĊĠĠĠ Ġis ĠFragment Tag Type Ġ-> Ġcreate Fragment Projection ( parent , Ġtag ) ĊĠĠĠ Ġis ĠView Tag Type < *> Ġ-> Ġcreate View Projection ( parent , Ġtag ) ĊĠĠĠ Ġelse Ġ-> Ġcreate Host Projection ( parent , Ġtag ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Context Projection ( ĊĠĠĠ Ġparent : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ): ĠProjection < N > Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= Ġtag . type Ġas ĠContext Tag Type < Any ?> ĊĠĠĠ Ġval Ġprops Ġ= Ġtag . props Ġas ĠContext Props < Any ?> ĊĊĠĠĠ Ġreturn ĠEcho . with Context ( type . context , Ġprops . value ) Ġ{ ĊĠĠĠĠĠ Ġbuild Projection ( ĊĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent , ĊĠĠĠĠĠĠĠ Ġtag Ġ= Ġtag , ĊĠĠĠĠĠĠĠ Ġchildren Ġ= Ġtag . props . children , ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Fragment Projection ( ĊĠĠĠ Ġparent : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ): ĠProjection < N > Ġ= Ġbuild Projection ( ĊĠĠĠ Ġparent Ġ= Ġparent , ĊĠĠĠ Ġtag Ġ= Ġtag , ĊĠĠĠ Ġchildren Ġ= Ġtag . props . children , ĊĠ Ġ) ĊĊĠ Ġprivate Ġfun Ġcreate Host Projection ( ĊĠĠĠ Ġparent : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ): ĠProjection < N > Ġ{ ĊĠĠĠ Ġval Ġnode Ġ= Ġproject or . createNode ( tag . type Ġas ĠT , Ġtag . props Ġas ĠP ) ĊĊĠĠĠ Ġreturn Ġbuild Projection ( ĊĠĠĠĠĠ Ġparent Ġ= Ġparent , ĊĠĠĠĠĠ Ġtag Ġ= Ġtag , ĊĠĠĠĠĠ Ġchildren Ġ= Ġtag . props . children , ĊĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate View Projection ( ĊĠĠĠ Ġparent : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ): ĠProjection < N > Ġ{ ĊĠĠĠ Ġvar Ġchild : ĠTag ? Ġ= Ġnull ĊĠĠĠ Ġval Ġhooks Ġ= ĠEcho . with Hooks Ġ{ ĊĠĠĠĠĠ Ġval Ġtype Ġ= Ġtag . type Ġas ĠView Tag Type < Props > ĊĠĠĠĠĠ Ġchild Ġ= Ġtype . view . render ( tag . props ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġbuild Projection ( ĊĠĠĠĠĠ Ġparent Ġ= Ġparent , ĊĠĠĠĠĠ Ġtag Ġ= Ġtag , ĊĠĠĠĠĠ Ġchildren Ġ= ĠlistOf ( child ), ĊĠĠĠĠĠ Ġhooks Ġ= Ġhooks , ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ) Ġ= Ġwhen Ġ( tag . type ) Ġ{ ĊĠĠĠ Ġis ĠContext Tag Type < *> Ġ-> Ġupdate Context Projection ( projection , Ġtag ) ĊĠĠĠ Ġis ĠFragment Tag Type Ġ-> Ġupdate Fragment Projection ( projection , Ġtag ) ĊĠĠĠ Ġis ĠView Tag Type < *> Ġ-> Ġupdate View Projection ( projection , Ġtag ) ĊĠĠĠ Ġelse Ġ-> Ġupdate Host Projection ( projection , Ġtag ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Context Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= Ġtag . type Ġas ĠContext Tag Type < Any ?> ĊĠĠĠ Ġval Ġprops Ġ= Ġtag . props Ġas ĠContext Props < Any ?> ĊĊĠĠĠ ĠEcho . with Context ( type . context , Ġprops . value ) Ġ{ ĊĠĠĠĠĠ Ġprojection . props Ġ= Ġtag . props ĊĠĠĠĠĠ Ġprojection . children Ġ= Ġre concile Children ( projection , Ġtag . props . children ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Fragment Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġprojection . props Ġ= Ġtag . props ĊĠĠĠ Ġprojection . children Ġ= Ġre concile Children ( projection , Ġtag . props . children ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Host Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġif Ġ( projection . props Ġ!= Ġtag . props ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnode Ġ= Ġrequire NotNull ( projection . node ) ĊĠĠĠĠĠ Ġproject or . update Node ( node , Ġprojection . props Ġas ĠP , Ġtag . props Ġas ĠP ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprojection . props Ġ= Ġtag . props ĊĠĠĠ Ġprojection . children Ġ= Ġre concile Children ( projection , Ġtag . props . children ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate View Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġvar Ġchild : ĠTag ? Ġ= Ġnull ĊĠĠĠ Ġval Ġhooks Ġ= ĠEcho . with Hooks ( projection . hooks ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtype Ġ= Ġtag . type Ġas ĠView Tag Type < Props > ĊĠĠĠĠĠ Ġchild Ġ= Ġtype . view . render ( tag . props ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprojection . props Ġ= Ġtag . props ĊĠĠĠ Ġprojection . children Ġ= Ġre concile Children ( projection , ĠlistOf ( child )) ĊĠĠĠ Ġprojection . hooks Ġ= Ġhooks ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġremove Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠ Ġ) Ġ= Ġwhen Ġ( projection . type ) Ġ{ ĊĠĠĠ Ġis ĠContext Tag Type < *> Ġ-> Ġremove Context Projection ( projection ) ĊĠĠĠ Ġis ĠFragment Tag Type Ġ-> Ġremove Fragment Projection ( projection ) ĊĠĠĠ Ġis ĠView Tag Type < *> Ġ-> Ġremove View Projection ( projection ) ĊĠĠĠ Ġelse Ġ-> Ġremove Host Projection ( projection ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġremove Context Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġprojection . children . forEach (:: remove Projection ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġremove Fragment Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġprojection . children . forEach (:: remove Projection ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġremove Host Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġparent Node Ġ= Ġrequire NotNull ( projection . parent ?. outer Node ) ĊĠĠĠ Ġval Ġnode Ġ= Ġrequire NotNull ( projection . node ) ĊĊĠĠĠ Ġprojection . children . forEach (:: remove Projection ) ĊĠĠĠ Ġproject or . removeChild ( parentNode , Ġnode ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġremove View Projection ( ĊĠĠĠ Ġprojection : ĠProjection < N >, ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġprojection . children . forEach (:: remove Projection ) ĊĊĠĠĠ ĠEcho . defer Callback Ġ{ ĊĠĠĠĠĠ Ġprojection . hooks ĊĠĠĠĠĠĠĠ Ġ. filter Is Instance < Effect Hook >() ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . cleanup Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġit () Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbuild Projection ( ĊĠĠĠ Ġparent : ĠProjection < N >, ĊĠĠĠ Ġtag : ĠTag , ĊĠĠĠ Ġchildren : ĠList < Tag ? >, ĊĠĠĠ Ġnode : ĠN ? Ġ= Ġnull , ĊĠĠĠ Ġhooks : ĠList < Hook > Ġ= Ġempty List (), ĊĠ Ġ): ĠProjection < N > Ġ{ ĊĠĠĠ Ġval Ġprojection Ġ= ĠProjection ( ĊĠĠĠĠĠ Ġkey Ġ= Ġtag . key , ĊĠĠĠĠĠ Ġtype Ġ= Ġtag . type , ĊĠĠĠĠĠ Ġprops Ġ= Ġtag . props , ĊĠĠĠĠĠ Ġparent Ġ= Ġparent , ĊĠĠĠĠĠ Ġnode Ġ= Ġnode , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprojection . children Ġ= Ġre concile Children ( projection , Ġchildren ) ĊĠĠĠ Ġprojection . hooks Ġ= Ġhooks ĊĊĠĠĠ Ġreturn Ġprojection ĊĠ Ġ} Ċ } Ċ