/* Ċ Ġ* ĠĠĠ ĠCopyright Ġ 2 0 1 8 ĠN ie k ĠH aar man Ċ Ġ* Ċ Ġ* ĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . n ha ar man . ac orn . navigation Ċ Ċ import Ġandroidx . annotation . Call Super Ċ import Ġcom . n ha ar man . ac orn . On Back Press Listener Ċ import Ġcom . n ha ar man . ac orn . internal . v Ċ import Ġcom . n ha ar man . ac orn . internal . w Ċ import Ġcom . n ha ar man . ac orn . presentation . Container Ċ import Ġcom . n ha ar man . ac orn . presentation . S av able Scene Ċ import Ġcom . n ha ar man . ac orn . presentation . Scene Ċ import Ġcom . n ha ar man . ac orn . state . Navigator State Ċ import Ġcom . n ha ar man . ac orn . state . Scene State Ċ import Ġcom . n ha ar man . ac orn . state . get Ċ import Ġcom . n ha ar man . ac orn . util . lazy Var Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠAn Ġabstract Ġ[ Navigator ] Ġclass Ġthat Ġis Ġable Ġto Ġgo Ġback Ġand Ġforth Ġthrough Ġa Ċ Ġ* Ġlist Ġof Ġ[ Scene ] s . Ċ Ġ* Ċ Ġ* ĠThis ĠNavigator Ġhas Ġtwo Ġmethods Ġ[ next ] Ġand Ġ[ previous ] Ġto Ġnavigate Ġthrough Ġthe Ċ Ġ* ĠSc enes . ĠCalling Ġ[ previous ] Ġwhen Ġthe Ġfirst ĠScene Ġis Ġbeing Ġshown Ġwill Ġhave Ġno Ċ Ġ* Ġeffect , Ġcalling Ġ[ next ] Ġwhen Ġthe Ġlast ĠScene Ġis Ġbeing Ġshown Ġwill Ġfinish Ġthis Ċ Ġ* ĠNavigator . Ċ Ġ* Ċ Ġ* ĠImplement ers Ġmust Ġimplement Ġ[ create Scene ] Ġto Ġprovide Ġthe Ġproper ĠSc enes . Ċ Ġ* Ċ Ġ* ĠThis ĠNavigator Ġis Ġable Ġto Ġsave Ġand Ġrestore Ġits Ġinstance Ġstate Ġin Ċ Ġ* Ġ[ save InstanceState ], Ġbut Ġdoes Ġnot Ġimplement Ġ[ S av able Navigator ] Ġitself . Ċ Ġ* ĠYou Ġcan Ġopt Ġin Ġto Ġthis Ġstate Ġsaving Ġby Ġexplicitly Ġimplementing Ġthe Ċ Ġ* Ġ[ S av able Navigator ] Ġinterface . Ċ Ġ* Ċ Ġ* Ġ@ param Ġsaved State ĠAn Ġoptional Ġinstance Ġthat Ġcontains Ġsaved Ġstate Ġas Ġreturned Ċ Ġ* Ġby Ġ[ save InstanceState ]. Ċ Ġ*/ Ċ abstract Ġclass ĠWizard Navigator ( ĊĠĠĠ Ġprivate Ġval Ġsaved State : ĠNavigator State ? Ċ ) Ġ: ĠNavigator , ĠOn Back Press Listener Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġthe ĠScene Ġfor Ġgiven Ġ[ index ], Ġstarting Ġat Ġ` 0 `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġwill Ġbe Ġcalled Ġup Ġto Ġonce Ġfor Ġeach Ġindex , Ġresults Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġreused Ġwhen Ġnavig ating Ġthrough Ġthe Ġwizard . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcreated Ġ[ Scene ], Ġor Ġ` null ` Ġif Ġthe Ġend Ġof Ġthe Ġwizard Ġis Ġreached . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcreate Scene ( index : ĠInt ): ĠScene < out ĠContainer >? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInstanti ates Ġa Ġ[ Scene ] Ġinstance Ġfor Ġgiven Ġ[ scene Class ] Ġand Ġ[ state ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġis Ġcalled Ġwhen Ġrest oring Ġthe ĠStack Navigator Ġfrom Ġa Ġsaved Ġstate . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġscene Class ĠThe Ġclass Ġof Ġthe Ġ[ Scene ] Ġto Ġinstantiate . ĊĠĠĠĠ Ġ* Ġ@ param Ġstate ĠThe Ġsaved Ġstate Ġof Ġthe Ġ[ Scene ] Ġif Ġapplicable . ĠThis Ġwill Ġbe ĊĠĠĠĠ Ġ* Ġthe Ġinstance Ġas Ġreturned Ġfrom Ġ[ S av able Scene . save InstanceState ] Ġif Ġits ĊĠĠĠĠ Ġ* Ġstate Ġwas Ġsaved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġinstantiate Scene ( scene Class : ĠK Class < out ĠScene <* >>, Ġstate : ĠScene State ?): ĠScene < out ĠContainer > ĊĊĠĠĠ Ġprivate Ġvar Ġstate Ġby Ġlazy Var Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize : ĠInt ? Ġ= Ġsaved State ?. get (" size ") ĊĠĠĠĠĠĠĠ Ġval Ġactive Index : ĠInt ? Ġ= Ġsaved State ?. get (" active _ index ") ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġnull Ġ|| Ġsize Ġ== Ġ 0 Ġ|| Ġactive Index Ġ== Ġnull Ġ|| Ġsaved State Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscene Ġ= Ġcreate Scene ( 0 ) Ġ?: Ġerror (" Initial ĠScene Ġmay Ġnot Ġbe Ġnull .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ lazy Var ĠState . create ( listOf ( scene ), Ġ 0 ) Ġ{ Ġindex Ġ-> Ġcreate Scene ( index ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġscenes Ġ= Ġ( 0 Ġuntil Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName : ĠString ? Ġ= Ġsaved State [" ${ index }_ class "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( className Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Scene ( index ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstantiate Scene ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene Class Ġ= ĠClass . forName ( className ). kotlin Ġas ĠK Class < out ĠScene <* >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġsaved State [" ${ index }_ state "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠState . create ( scenes , Ġactive Index ) Ġ{ Ġindex Ġ-> Ġcreate Scene ( index ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġadd Navigator Events Listener ( listener : ĠNavigator . Events ): ĠDis posable Handle Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . addListener ( listener ) ĊĊĠĠĠĠĠĠĠ Ġ( state Ġas ? ĠState . Active ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġstate Ġ-> Ġstate . scenes [ state . active Index ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġlistener . scene ( it , Ġnull ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠDis posable Handle Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Disposed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlistener Ġ! in Ġstate . listeners ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . remove Listener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNavig ates Ġto Ġthe Ġnext Ġ[ Scene ] Ġin Ġthis Ġwizard Ġif Ġpossible . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġno Ġnext ĠScene , Ġthis ĠNavigator Ġwill Ġfinish Ġand Ġall ĠSc enes Ġwill ĊĠĠĠĠ Ġ* Ġbe Ġdestroyed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġa Ġnext ĠScene Ġand Ġthis ĠNavigator Ġis Ġcurrently Ġactive , Ġthe ĊĠĠĠĠ Ġ* Ġcurrent Ġ[ Scene ] Ġwill Ġbe Ġstopped , Ġand Ġthe Ġnext ĠScene Ġwill Ġbe Ġstarted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġa Ġnext ĠScene Ġand Ġthis ĠNavigator Ġis Ġcurrently Ġinactive , Ġno ĠScene ĊĠĠĠĠ Ġ* Ġlifecycle Ġevents Ġwill Ġbe Ġcalled Ġat Ġall . ĠStarting Ġthis ĠNavigator Ġwill Ġtrigger ĊĠĠĠĠ Ġ* Ġa Ġcall Ġto Ġthe Ġ[ Scene . onStart ] Ġof Ġthe Ġnext ĠScene Ġin Ġthe Ġwizard . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCalling Ġthis Ġmethod Ġwhen Ġthis ĠNavigator Ġhas Ġbeen Ġdestroyed Ġwill Ġhave Ġno ĊĠĠĠĠ Ġ* Ġeffect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext () Ġ{ ĊĠĠĠĠĠĠĠ Ġv (" Wizard Navigator ", Ġ" next ") ĊĊĠĠĠĠĠĠĠ Ġexecute ( state . next ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNavig ates Ġto Ġthe Ġnext Ġ[ Scene ] Ġin Ġthis Ġwizard Ġif Ġpossible . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġno Ġprevious ĠScene , Ġnothing Ġwill Ġhappen . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġa Ġprevious ĠScene Ġand Ġthis ĠNavigator Ġis Ġcurrently Ġactive , Ġthe ĊĠĠĠĠ Ġ* Ġcurrent Ġ[ Scene ] Ġwill Ġbe Ġstopped , Ġand Ġthe Ġprevious ĠScene Ġwill Ġbe Ġstarted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġis Ġa Ġprevious ĠScene Ġand Ġthis ĠNavigator Ġis Ġcurrently Ġinactive , Ġno ĊĠĠĠĠ Ġ* ĠScene Ġlifecycle Ġevents Ġwill Ġbe Ġcalled Ġat Ġall . ĠStarting Ġthis ĠNavigator Ġwill ĊĠĠĠĠ Ġ* Ġtrigger Ġa Ġcall Ġto Ġthe Ġ[ Scene . onStart ] Ġof Ġthe Ġprevious ĠScene Ġin Ġthe Ġwizard . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCalling Ġthis Ġmethod Ġwhen Ġthis ĠNavigator Ġhas Ġbeen Ġdestroyed Ġwill Ġhave Ġno ĊĠĠĠĠ Ġ* Ġeffect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġprevious () Ġ{ ĊĠĠĠĠĠĠĠ Ġv (" Wizard Navigator ", Ġ" previous ") ĊĊĠĠĠĠĠĠĠ Ġexecute ( state . previous ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFin ishes Ġthis ĠNavigator . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthis ĠNavigator Ġis Ġcurrently Ġactive , Ġthe Ġcurrent ĠScene Ġwill Ġgo Ġthrough ĊĠĠĠĠ Ġ* Ġits Ġdestroy ing Ġlifecycle Ġcalling Ġ[ Scene . on Stop ] Ġand Ġ[ Scene . on Destroy ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthis ĠNavigator Ġis Ġcurrently Ġnot Ġactive , Ġthe Ġcurrent ĠScene Ġwill Ġonly ĊĠĠĠĠ Ġ* Ġhave Ġits Ġ[ Scene . on Destroy ] Ġmethod Ġcalled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCalling Ġthis Ġmethod Ġwhen Ġthe ĠNavigator Ġhas Ġbeen Ġdestroyed Ġwill Ġhave Ġno ĊĠĠĠĠ Ġ* Ġeffect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfinish () Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute ( state . finish ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġv (" Wizard Navigator ", Ġ" onStart ") ĊĊĠĠĠĠĠĠĠ Ġexecute ( state . start ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġv (" Wizard Navigator ", Ġ" on Stop ") ĊĊĠĠĠĠĠĠĠ Ġexecute ( state . stop ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġv (" Wizard Navigator ", Ġ" on Destroy ") ĊĊĠĠĠĠĠĠĠ Ġexecute ( state . destroy ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠState . Destroyed ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġv (" Wizard Navigator ", Ġ" on Back Pressed ") ĊĠĠĠĠĠĠĠ Ġif Ġ( state . active Index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute ( state . finish ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute ( state . previous ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute ( transition : ĠState Transition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġtransition . newState ĊĠĠĠĠĠĠĠ Ġtransition . action ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġopen Ġfun Ġsave InstanceState (): ĠNavigator State Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . scenes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold Indexed ( Navigator State ()) Ġ{ Ġindex , Ġbundle , Ġscene Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scene Ġis ĠS av able Scene ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [" ${ index }_ class "] Ġ= Ġscene :: class . java . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [" ${ index }_ state "] Ġ= Ġscene . save InstanceState () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [" size "] Ġ= Ġstate . scenes . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [" active _ index "] Ġ= Ġstate . active Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Destroyed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate Ġis ĠState . Destroyed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠState Ġ{ ĊĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġscenes : ĠList < Scene < out ĠContainer >> ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġactive Index : ĠInt ĊĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġlisteners : ĠList < Navigator . Events > ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġadd Listener ( listener : ĠNavigator . Events ) ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġremove Listener ( listener : ĠNavigator . Events ) ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġstart (): ĠState Transition ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġstop (): ĠState Transition ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġdestroy (): ĠState Transition ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġnext (): ĠState Transition ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġprevious (): ĠState Transition ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġfinish (): ĠState Transition ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes : ĠList < Scene < out ĠContainer >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory : Ġ( Int ) Ġ-> ĠScene < out ĠContainer >? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠState Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIn active ( scenes , Ġinitial Index , Ġempty List (), Ġfactory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠIn active ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġscenes : ĠList < Scene < out ĠContainer >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġactive Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar Ġlisteners : ĠList < Navigator . Events >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġfactory : Ġ( Int ) Ġ-> ĠScene < out ĠContainer >? ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠState () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( scenes . isNotEmpty ()) Ġ{ Ġ" List Ġof ĠSc enes Ġmay Ġnot Ġbe Ġempty ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Index Ġ>= Ġscenes . size ) Ġthrow ĠArray Index OutOfBoundsException (" Scene Ġindex Ġout Ġof Ġrange : Ġ$ active Index .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Listener ( listener : ĠNavigator . Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners Ġ+= Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove Listener ( listener : ĠNavigator . Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners Ġ-= Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Active ( scenes , Ġactive Index , Ġlisteners , Ġfactory )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes [ active Index ]. onStart () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . scene ( scenes [ active Index ], Ġnull ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstop (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdestroy (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Destroyed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes . as Re versed (). forEach Ġ{ Ġit . on Destroy () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Sc enes Ġ= Ġscenes . filled Up To ( active Index Ġ+ Ġ 1 , Ġfactory ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Sc enes Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Destroyed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes . as Re versed (). forEach Ġ{ Ġit . on Destroy () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Inactive ( new Sc enes , Ġactive Index Ġ+ Ġ 1 , Ġlisteners , Ġfactory )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprevious (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Index Ġ= ĠMath . max ( 0 , Ġactive Index Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Inactive ( scenes , Ġnew Index , Ġlisteners , Ġfactory )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfinish (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Destroyed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . finished () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes . as Re versed (). forEach Ġ{ Ġit . on Destroy () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠActive ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġscenes : ĠList < Scene < out ĠContainer >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġactive Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar Ġlisteners : ĠList < Navigator . Events >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġfactory : Ġ( Int ) Ġ-> ĠScene < out ĠContainer >? ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠState () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( scenes . isNotEmpty ()) Ġ{ Ġ" List Ġof ĠSc enes Ġmay Ġnot Ġbe Ġempty ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Listener ( listener : ĠNavigator . Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners Ġ+= Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove Listener ( listener : ĠNavigator . Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners Ġ-= Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstop (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Inactive ( scenes , Ġactive Index , Ġlisteners , Ġfactory )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes [ active Index ]. on Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdestroy (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstop (). and Then Ġ{ Ġit . destroy () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Index Ġ= Ġactive Index Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Sc enes Ġ= Ġscenes . filled Up To ( new Index , Ġfactory ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Sc enes Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Destroyed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes [ active Index ]. on Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes . as Re versed (). forEach Ġ{ Ġit . on Destroy () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . finished () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Active ( new Sc enes , Ġnew Index , Ġlisteners , Ġfactory )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes [ active Index ]. on Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Sc enes [ new Index ]. onStart () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . scene ( new Sc enes [ new Index ], ĠTransition Data . forward s ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprevious (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Index Ġ== Ġ 0 ) Ġreturn ĠState Transition ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Active ( scenes , Ġactive Index Ġ- Ġ 1 , Ġlisteners , Ġfactory )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes [ active Index ]. on Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes [ active Index Ġ- Ġ 1 ]. onStart () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . scene ( scenes [ active Index Ġ- Ġ 1 ], ĠTransition Data . back wards ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfinish (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( Inactive ( scenes , Ġactive Index , Ġlisteners , Ġfactory )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . finished () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscenes [ active Index ]. on Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. and Then Ġ{ Ġit . destroy () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠDestroy ed Ġ: ĠState () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġscenes : ĠList < Scene < out ĠContainer >> Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġactive Index : ĠInt Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġlisteners : ĠList < Navigator . Events > Ġ= Ġempty List () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Listener ( listener : ĠNavigator . Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove Listener ( listener : ĠNavigator . Events ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw (" Wizard Navigator . State ", Ġ" Warning : ĠCannot Ġstart Ġstate Ġafter Ġnavigator Ġis Ġdestroyed .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstop (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdestroy (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw (" Wizard Navigator . State ", Ġ" Warning : ĠCannot Ġgo Ġto Ġnext Ġscene Ġafter Ġnavigator Ġis Ġdestroyed .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprevious (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw (" Wizard Navigator . State ", Ġ" Warning : ĠCannot Ġgo Ġto Ġprevious Ġscene Ġafter Ġnavigator Ġis Ġdestroyed .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfinish (): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw (" Wizard Navigator . State ", Ġ" Warning : ĠCannot Ġfinish Ġnavigator Ġafter Ġnavigator Ġis Ġdestroyed .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġ< T > ĠList < T >. filled Up To ( index : ĠInt , Ġf : Ġ( Int ) Ġ-> ĠT ?): ĠList < T >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ> Ġindex ) Ġreturn Ġthis ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( size .. index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold < Int , ĠList < T >? >( this ) Ġ{ Ġlist , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ( i )?. let Ġ{ Ġt Ġ-> Ġlist ?. let Ġ{ Ġit Ġ+ Ġt Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠState Transition ( ĊĠĠĠĠĠĠĠ Ġval ĠnewState : ĠState , ĊĠĠĠĠĠĠĠ Ġval Ġaction : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġand Then ( f : Ġ( State ) Ġ-> ĠState Transition ): ĠState Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Transition Ġ= Ġf ( newState ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Transition . newState ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Transition . action ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ