package Ġde . ss ch ol z . connections Ċ Ċ import Ġde . ss ch ol z . Person Ċ import Ġde . ss ch ol z . util . Toast s Ċ import Ġde . ss ch ol z . util . remove Last ĊĊ Ċ class ĠConnection s Ġ{ ĊĊĠĠĠ Ġval Ġconnections Ġ= ĠArrayList < Connection >() ĊĠĠĠ Ġval Ġconnections In User Order Ġ= ĠArrayList < Connection >() ĊĊĠĠĠ Ġ// Ġbe Ġcareful Ġto Ġalways Ġadd Ġyour Ġconnections Ġin Ġthe Ġsame Ġorder , ĊĠĠĠ Ġ// Ġotherwise Ġthe Ġbehavior Ġmight Ġbecome Ġnon - determin istic ĊĠĠĠ Ġfun Ġadd Connection ( type : ĠType , Ġperson A : ĠPerson , Ġperson B : ĠPerson ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġcreate Connection ( person A , Ġperson B , Ġtype ) ĊĠĠĠĠĠĠĠ Ġconnections . add ( connection ) ĊĠĠĠĠĠĠĠ Ġconnections In User Order . add ( connection ) ĊĠĠĠĠĠĠĠ Ġconnections . sort With ( compare By ({ Ġit . person A . person Index Ġ}, Ġ{ Ġit . person B . person Index Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Connection ( person A : ĠPerson , Ġperson B : ĠPerson , Ġtype : ĠType ): ĠConnection Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġa Ġ= Ġperson A ĊĠĠĠĠĠĠĠ Ġvar Ġb Ġ= Ġperson B ĊĠĠĠĠĠĠĠ Ġif Ġ( type . is Symmetric Ġ&& Ġperson A . person Index Ġ> Ġperson B . person Index ) Ġ{ Ġ// Ġnormalize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ= Ġperson A ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ= Ġperson B ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Family Ġ-> ĠFamily Connection ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Work Ġ-> ĠWork Connection ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . H ug Ġ-> ĠH ug Connection ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Res ent ment Ġ-> ĠRes ent ment Connection ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Cr ush Ġ-> ĠCr ush Connection ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Lo ve Ġ-> ĠLove Connection ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Code pend ency Ġ-> ĠCode pend ency Connection ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Friend ship Ġ-> ĠFriend ship Connection ( a , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType . Ab use Ġ-> ĠAb use Connection ( a , Ġb ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġconnection ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Connection AtIndex ( connection Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnections [ connection Index ]. destroy () ĊĠĠĠĠĠĠĠ Ġval Ġremoved Connection Ġ= Ġconnections . remove At ( connection Index ) ĊĠĠĠĠĠĠĠ Ġconnections In User Order . remove ( removed Connection ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġshall Ġbe Ġcalled Ġ* before * Ġthe Ġworld Ġstep ĊĠĠĠ Ġfun Ġupdate All Connections ( deltaTime : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnections . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . update ( deltaTime ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender All Connections () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnections . forEach Ġ{ Ġit . render () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdestroy All () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnections . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconnections . clear () ĊĠĠĠĠĠĠĠ Ġconnections In User Order . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtwo Ġcr ushes Ġare Ġpossible , Ġbut Ġnot Ġfamily Ġtwice ĊĠĠĠ Ġfun Ġhas Ident ical Connection OfType ( connection Type : ĠType , Ġperson A : ĠPerson , Ġperson B : ĠPerson ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġconnections . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . type Ġ!= Ġconnection Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connection Type . is Symmetric ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . person A Ġ=== Ġperson B Ġ&& Ġit . person B Ġ=== Ġperson A ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . person A Ġ=== Ġperson A Ġ&& Ġit . person B Ġ=== Ġperson B ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdestroy All Connection sWith Person ( existing Person : ĠPerson ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġto Be Deleted Ġ= Ġconnections . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . person A Ġ=== Ġexisting Person Ġ|| Ġit . person B Ġ=== Ġexisting Person ĊĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġto Be Deleted . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnections . remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnections In User Order . remove ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtry ToRemove Last Connection User Added () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! connections In User Order . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast s . show Toast (" Removed Ġconnection :\ n ${ connections In User Order . last (). to N ice String () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Connection Ġ= Ġconnections In User Order . remove Last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnections . remove ( removed Connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Connection . destroy () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast s . show Toast (" Nothing Ġto Ġundo .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Connections In Sorted Order ( map : ĠList < Triple < Type , ĠPerson , ĠPerson >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġmap . zip ( 1 .. map . size ). sorted With ( compare By ({ Ġ( it , Ġ_) Ġ-> Ġit . second . person Index Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ( it , Ġ_) Ġ-> Ġit . third . person Index Ġ})). map Ġ{ Ġ( it , Ġi ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġcreate Connection ( it . second , Ġit . third , Ġit . first ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnections . add ( connection ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( i , Ġconnection ) ĊĠĠĠĠĠĠĠ Ġ}. sorted By Ġ{ Ġit . first Ġ}. forEach Ġ{ Ġ(_, Ġconnection ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnections In User Order . add ( connection ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġepsilon Ġ= Ġ 0 . 0 0 0 1 f ĊĠĠĠ Ġ} Ċ } Ċ