package Ġcom . so yle . stories . use case . scene . get Potential Change From Re ordering Scene Ċ Ċ import Ġcom . so yle . stories . domain . character . Character Ċ import Ġcom . so yle . stories . domain . project . Project Ċ import Ġcom . so yle . stories . domain . scene . Character In Scene Ċ import Ġcom . so yle . stories . domain . scene . Scene Ċ import Ġcom . so yle . stories . use case . scene . Scene DoesNotExist Ċ import Ġcom . so yle . stories . use case . scene . Scene Repository Ċ import Ġcom . so yle . stories . use case . scene . common . Affected Character Ċ import Ġcom . so yle . stories . use case . scene . common . Affected Scene Ċ import Ġcom . so yle . stories . use case . scene . common . Previous Mot iv ations . Companion . sorted By Project Order Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashMap Ċ Ċ class ĠGet Potential Changes From Re ordering Scene UseCase ( ĊĠĠĠ Ġprivate Ġval Ġscene Repository : ĠScene Repository Ċ ) Ġ: ĠGet Potential Changes From Re ordering Scene Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinvoke ( scene Id : ĠUUID , Ġindex : ĠInt , Ġoutput : ĠGet Potential Changes From Re ordering Scene . Output Port ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscene Ġ= Ġget Scene ( scene Id ) ĊĠĠĠĠĠĠĠ Ġval Ġaffected Sc enes Ġ= Ġget Sc enes Affected By Moving Scene To Index ( scene , Ġindex ) ĊĠĠĠĠĠĠĠ ĠPot ential Changes From Re ordering Scene ( affected Sc enes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let ( output :: receive Potential Changes From Re ordering Scene ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Scene ( scene Id : ĠUUID ) Ġ= Ġ( scene Repository . get Scene ById ( Scene . Id ( scene Id )) ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠScene DoesNotExist ( scene Id )) ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Sc enes Affected By Moving Scene To Index ( scene : ĠScene , Ġindex : ĠInt ): ĠList < Affected Scene > ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġordered Sc enes Ġ= Ġscene Repository . get Ordered Sc enes ( scene . projectId ) Ġ// ĠA , ĠB , ĠC ĊĠĠĠĠĠĠĠ Ġif Ġ( index . is Same As Current Index ( ordered Sc enes , Ġscene )) Ġreturn ĠlistOf () Ġ// Ġ 2 Ġ== Ġ 0 , Ġ 2 Ġ== Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġreordered Sc enes Ġ= Ġordered Sc enes . move Scene ( scene , Ġindex ) Ġ// ĠB , ĠA , ĠC ĊĠĠĠĠĠĠĠ Ġreturn Ġget Sc enes With Changed Mot ivation For Characters ( ordered Sc enes , Ġreordered Sc enes , Ġscene . included Characters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠScene Repository . get Ordered Sc enes ( projectId : ĠProject . Id ): ĠIndexed Sc enes Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscenes Ġ= Ġlist All Sc enes In Project ( projectId ) ĊĠĠĠĠĠĠĠ Ġreturn ĠIndexed Sc enes ( scenes . sorted By Project Order ( projectId , Ġthis )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠInt . is Same As Current Index ( ordered Sc enes : ĠIndexed Sc enes , Ġscene : ĠScene ): ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠcurrentIndex Ġ= Ġordered Sc enes . indexOf ( scene . id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġ== ĠcurrentIndex Ġ|| Ġthis Ġ== ĠcurrentIndex Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠIndexed Sc enes . move Scene ( scene : ĠScene , Ġindex : ĠInt ): ĠIndexed Sc enes Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= ĠindexOf ( scene . id ) ĊĠĠĠĠĠĠĠ Ġval Ġnew List Ġ= Ġif Ġ( startIndex Ġ< Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Forward ( index Ġ- 1 , ĠstartIndex ) ĊĠĠĠĠĠĠĠ Ġelse Ġmove Backward ( index , ĠstartIndex ) ĊĠĠĠĠĠĠĠ Ġreturn ĠIndexed Sc enes ( new List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIndexed Sc enes . move Backward ( ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ ĠstartIndex : ĠInt ĊĠĠĠ Ġ): ĠList < Scene > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠList ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< Ġindex Ġ-> Ġthis [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġindex Ġ-> Ġthis [ startIndex ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ<= ĠstartIndex Ġ-> Ġthis [ it Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIndexed Sc enes . move Forward ( ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ ĠstartIndex : ĠInt ĊĠĠĠ Ġ): ĠList < Scene > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠList ( size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< ĠstartIndex Ġ-> Ġthis [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< Ġindex Ġ-> Ġthis [ it Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ== Ġindex Ġ-> Ġthis [ startIndex ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sc enes With Changed Mot ivation For Characters ( ĊĠĠĠĠĠĠĠ Ġordered Sc enes : ĠIndexed Sc enes , ĊĠĠĠĠĠĠĠ Ġreordered Sc enes : ĠIndexed Sc enes , ĊĠĠĠĠĠĠĠ Ġcharacters : ĠCollection < Character In Scene > ĊĠĠĠ Ġ): ĠList < Affected Scene > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Affected Sc enes By Character ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġordered Sc enes , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreordered Sc enes , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters ĊĠĠĠĠĠĠĠ Ġ). map Ġ{ Ġ( affected Scene , Ġaffected Characters ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAff ected Scene ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Scene . id . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Scene . name . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Characters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Affected Sc enes By Character ( ĊĠĠĠĠĠĠĠ Ġordered Sc enes : ĠIndexed Sc enes , ĊĠĠĠĠĠĠĠ Ġreordered Sc enes : ĠIndexed Sc enes , ĊĠĠĠĠĠĠĠ Ġcharacters : ĠCollection < Character In Scene > ĊĠĠĠ Ġ) Ġ= Ġcharacters . as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Affected Sc enes For Character ( ordered Sc enes , Ġreordered Sc enes , Ġit . character Id ). as Sequence () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . map Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Affected Sc enes For Character ( ĊĠĠĠĠĠĠĠ Ġordered Sc enes : ĠIndexed Sc enes , ĊĠĠĠĠĠĠĠ Ġreordered Sc enes : ĠIndexed Sc enes , ĊĠĠĠĠĠĠĠ Ġcharacter : ĠCharacter . Id ĊĠĠĠ Ġ) Ġ= Ġordered Sc enes . map NotNull Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaffect On Character Ġ= Ġget A ffect On Character In Scene ( ordered Sc enes , Ġreordered Sc enes , Ġcharacter , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠ Ġit Ġto Ġaffect On Character ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget A ffect On Character In Scene ( ĊĠĠĠĠĠĠĠ Ġordered Sc enes : ĠIndexed Sc enes , ĊĠĠĠĠĠĠĠ Ġreordered Sc enes : ĠIndexed Sc enes , ĊĠĠĠĠĠĠĠ Ġcharacter : ĠCharacter . Id , ĊĠĠĠĠĠĠĠ Ġscene : ĠScene ĊĠĠĠ Ġ): ĠAff ected Character ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! scene . includes Character ( character )) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmotivation Ġ= Ġscene . getM ot ivation For Character ( character ) !! ĊĠĠĠĠĠĠĠ Ġif Ġ(! mot ivation . is Inherited ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Inherited Mot ive Ġ= Ġget Inherited Mot ive For Character In Scene ( ordered Sc enes , Ġcharacter , Ġscene ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Inherited Mot ive Ġ= Ġget Inherited Mot ive For Character In Scene ( reordered Sc enes , Ġcharacter , Ġscene ) ĊĠĠĠĠĠĠĠ Ġif Ġ( original Inherited Mot ive Ġ== Ġnew Inherited Mot ive ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠAff ected Character ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacter . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotivation . character Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Inherited Mot ive Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Inherited Mot ive Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Inherited Mot ive For Character In Scene ( ĊĠĠĠĠĠĠĠ Ġscenes : ĠIndexed Sc enes , ĊĠĠĠĠĠĠĠ Ġcharacter : ĠCharacter . Id , ĊĠĠĠĠĠĠĠ Ġscene : ĠScene ĊĠĠĠ Ġ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġscenes . indexOf ( scene . id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġscenes . getLast Set Mot ive For Character ( character , Ġindex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠIndexed Sc enes ( scenes : ĠList < Scene >) Ġ: ĠList < Scene > Ġby Ġscenes Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscene To Index : ĠMap < Scene . Id , ĠInt > Ġ= Ġscenes . with Index (). associate Ġ{ Ġit . value . id Ġto Ġit . index Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠindexOf ( scene : ĠScene . Id ): ĠInt Ġ= Ġscene To Index [ scene ] Ġ?: Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlast Set Mot ive For Character Cache Ġ= ĠHashMap < Pair < Character . Id , ĠInt >, ĠInt >() ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetLast Set Mot ive For Character ( character : ĠCharacter . Id , Ġfrom : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfrom Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Set Index Ġ= Ġlast Set Mot ive For Character Cache [ character Ġto Ġi ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Set Index Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Set Mot ive For Character Cache [ character Ġto Ġfrom ] Ġ= Ġlast Set Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis [ last Set Index ]. getM ot ivation For Character ( character ) !!. mot ivation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscene Ġ= Ġthis [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scene . includes Character ( character ) Ġ&& Ġ! Ġscene . getM ot ivation For Character ( character ) !!. is Inherited ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Set Mot ive For Character Cache [ character Ġto Ġfrom ] Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( i .. from ). forEach Ġ{ Ġlast Set Mot ive For Character Cache [ character Ġto Ġit ] Ġ= Ġi Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġscene . getM ot ivation For Character ( character ) !!. mot ivation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }