/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 - 2 0 2 0 ĠDr . ĠFl orian ĠSch mid t Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . dr x . e vo leq . dsl Ċ Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġorg . dr x . dynamics . ID Ċ import Ġorg . dr x . e vo leq . e volution . Stub Ċ import Ġorg . dr x . e vo leq . e volution . stubs . Action Stub Ċ import Ġorg . dr x . e vo leq . e volution . stubs . Updated Ċ import Ġorg . dr x . e vo leq . e vol ving . E vol ving Ċ import Ġorg . dr x . e vo leq . e vol ving . Parallel Ċ import Ġorg . dr x . e vo leq . e volution . phase . process . Simple Process Phase Ġas ĠPhase Ċ Ċ actual Ġopen Ġclass ĠAction Stub Configuration < I , ĠData > Ġ: ĠUpdate Stub Configuration < Data >() Ġ{ ĊĊĠĠĠ Ġactual Ġclass ĠAction Stub ConfigurationException Ġactual Ġconstructor ( override Ġval Ġmessage : ĠString ?) Ġ: ĠException ( message ) ĊĊĠĠĠ Ġactual Ġvar Ġon Input : Ġsuspend ĠCor outine Scope .( I , ĠData ) Ġ-> ĠPhase < Data > Ġ= Ġ{ _, data Ġ-> ĠPhase . Stop ( data )} ĊĊĠĠĠ Ġactual Ġoverride Ġfun Ġconfigure (): ĠAction Stub < I , ĠData > Ġ= Ġwith ( object Ġ: ĠAction Stub < I , ĠData >( update Parent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġid : ĠID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Action Stub Configuration . id ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġparent : ĠStub < *> ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Action Stub Configuration . parent ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġstub s : ĠHashMap < ID , ĠStub <* >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Action Stub Configuration . stubs ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠonUpdate : Ġsuspend ĠCor outine Scope .( Updated < Data >) Ġ-> ĠData ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Action Stub Configuration . on Update ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠonStart : Ġsuspend ĠCor outine Scope .( Data ) Ġ-> ĠData ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Action Stub Configuration . onStart ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġon Stop : Ġsuspend ĠCor outine Scope .( Data ) Ġ-> ĠData ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Action Stub Configuration . on Stop ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġon Input : Ġsuspend ĠCor outine Scope .( I , ĠData ) Ġ-> ĠPhase < Data > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Action Stub Configuration . on Input ĊĊĠĠĠ Ġ}) Ġstub @{ ĊĠĠĠĠĠĠĠ Ġconfigure Children ( this @ stub ) ĊĠĠĠĠĠĠĠ Ġstub . value Ġ= Ġthis @ stub ĊĠĠĠĠĠĠĠ Ġthis @ stub ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ E vo leq Dsl ĊĠĠĠ Ġactual Ġoverride Ġfun ĠStub Configuration < Data >. ev olve ( arrow : Ġsuspend ĠCor outine Scope .( Data ) Ġ-> ĠE vol ving < Data >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAction Stub ConfigurationException (" ev olve Ġfunction Ġis Ġalready Ġdefined ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ E vo leq Dsl ĊĠĠĠ Ġactual Ġfun ĠAction Stub Configuration < I , ĠData >. on Input ( input : Ġsuspend ĠCor outine Scope .( I , ĠData )-> ĠPhase < Data >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis @ Action Stub Configuration . on Input = Ġinput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ E vo leq Dsl ĊĠĠĠ Ġactual Ġsuspend Ġfun ĠAction Stub Configuration < I , Data >. self Update ( data : ĠData , Ġupdate : Ġsuspend ĠCor outine Scope .( Data )-> Data ): ĠData Ġ= ĊĠĠĠĠĠĠĠ ĠParallel { ĠonUpdate ( Updated ( this @ Action Stub Configuration . id , Ġupdate ( data ))) Ġ}. get () ĊĊĊĠĠĠ Ġ@ E vo leq Dsl ĊĠĠĠ Ġactual Ġfun Ġ< J , ĠE > ĠAction Stub Configuration < I , ĠData >. action Child ( id : ĠID , Ġconfiguration : ĠAction Stub Configuration < J , ĠE >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis @ Action Stub Configuration . child Configurations [ id ] Ġ= ĠPair ( Action Stub Configuration < J , ĠE >(), configuration Ġas ĠStub Configuration <* >. ()-> Unit ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ E vo leq Dsl ĊĠĠĠ Ġactual Ġopen Ġfun Ġ< J , ĠE > ĠAction Stub Configuration < I , ĠData >. action Child ( stub : ĠAction Stub < J , ĠE >) Ġ{ Ġthis @ Action Stub Configuration . action Child ( stub . id , Ġstub . configuration (). second ) Ġ} ĊĊ Ċ } Ċ @ E vo leq Dsl Ċ actual Ġfun Ġ< I , ĠData > Ġaction Stub ( configuration : ĠAction Stub Configuration < I , ĠData >. ()-> Unit ): ĠAction Stub < I , ĠData > Ġ= Ġwith ( Action Stub Configuration < I , ĠData >()) Ġ{ ĊĠĠĠ Ġconfiguration () ĊĠĠĠ Ġconfigure () Ċ } ĊĊĊ Ċ @ E vo leq Dsl Ċ actual Ġfun Ġ< J , ĠE > ĠStub Configuration <* >. action Child ( child Id : ĠID , configuration : ĠAction Stub Configuration < J , ĠE >. ()-> Unit ) Ġ{ ĊĠĠĠ Ġchild Configurations [ child Id ] Ġ= ĠPair ( Action Stub Configuration < J , ĠE >(), configuration Ġas ĠStub Configuration <* >. () Ġ-> ĠUnit ) Ċ } Ċ Ċ @ E vo leq Dsl Ċ actual Ġfun Ġ< J , ĠE > ĠStub Configuration <* >. action Child ( stub : ĠAction Stub < J , ĠE >) Ġ{ Ġaction Child ( stub . id , Ġstub . configuration (). second ) Ġ} Ċ Ċ @ E vo leq Dsl Ċ actual Ġfun Ġ< I , ĠData > ĠAction Stub < I , ĠData >. configuration (): ĠPair < out ĠStub Configuration <* >, Action Stub Configuration < I , ĠData >. ()-> Unit > Ġ= ĊĠĠĠ ĠPair < Stub Configuration <* >, Action Stub Configuration < I , ĠData >. ()-> Unit >( Action Stub Configuration < I , ĠData > ()){ ĊĠĠĠĠĠĠĠ Ġid ( this @ configuration . id ) ĊĠĠĠĠĠĠĠ ĠonStart ( this @ configuration . onStart ) ĊĠĠĠĠĠĠĠ Ġon Input ( this @ configuration . on Input ) ĊĠĠĠĠĠĠĠ ĠonUpdate ( this @ configuration . on Update ) ĊĠĠĠĠĠĠĠ Ġon Stop ( this @ configuration . on Stop ) ĊĠĠĠĠĠĠĠ Ġstub s . put All ( Ġthis @ configuration . stubs Ġ) ĊĠĠĠĠĠĠĠ Ġwhen ( this @ configuration . parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparent ( this @ configuration . parent !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}