/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠAlex andre ĠP iv ete au Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . github . alex and rep iv ete au . distributed . ca usal Graphs Ċ Ċ import Ġcom . github . alex and rep iv ete au . functional . mon ads . map Ċ import Ġcom . github . alex and rep iv ete au . functional . mon ads . to Maybe Ċ import Ġcom . github . alex and rep iv ete au . functional . mon ads . with Default Ċ Ċ internal Ġclass ĠArrayList Ca usal Graph Y arn < O , ĠS >( private Ġval Ġelements : ĠMutable List < Ca usal Graph Atom < O , ĠS >> Ġ= Ġmutable ListOf (), Ġoverride Ġval Ġsite : ĠS ) Ġ: ĊĠĠĠĠĠĠĠ ĠMutable Ca usal Graph Y arn < O , ĠS >, ĠList < Ca usal Graph Atom < O , ĠS >> Ġby Ġelements Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġinsert ( operation : ĠO , Ġdependencies : ĠSet < Ca usal Graph Identifier < S >> ): ĠC aus al Graph Identifier < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ: ĠMake Ġthis Ġcode Ġprettier . ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġelements . last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Maybe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ(_, Ġidentifier ) Ġ-> Ġidentifier Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ(_, Ġposition ) Ġ-> Ġposition Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Default ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= ĠC aus al Graph Identifier ( site , Ġposition ) ĊĠĠĠĠĠĠĠ Ġval Ġatom Ġ= ĠC aus al Graph Atom ( operation , Ġidentifier , Ġdependencies ) ĊĠĠĠĠĠĠĠ Ġelements Ġ+= Ġatom ĊĠĠĠĠĠĠĠ Ġreturn Ġidentifier ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmerge ( other : ĠMutable Ca usal Graph Y arn < O , ĠS >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġthe Ġtwo Ġmerge s ĠY ar ns Ġhave Ġthe Ġsame Ġorigin Ġsite . ĊĠĠĠĠĠĠĠ Ġcheck ( site Ġ== Ġother . site ) Ġ{ Ġ" Merged ĠY ar ns Ġmust Ġhave Ġthe Ġsame Ġsite Ġidentifier ." Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġa Sequence Ġ= Ġelements . as Sequence () ĊĠĠĠĠĠĠĠ Ġval Ġb Sequence Ġ= Ġother . as Sequence () ĊĊĠĠĠĠĠĠĠ Ġval Ġmerged List Ġ= Ġsequence Of ( a Sequence , Ġb Sequence ). flatten () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct By Ġ{ Ġit . identifier Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . identifier . index Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĊĠĠĠĠĠĠĠ Ġelements . clear () ĊĠĠĠĠĠĠĠ Ġelements . addAll ( merged List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmerge ( other : ĠC aus al Graph Y arn < O , ĠS >): ĠC aus al Graph Y arn < O , ĠS > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġthe Ġtwo Ġmerge s ĠY ar ns Ġhave Ġthe Ġsame Ġorigin Ġsite . ĊĠĠĠĠĠĠĠ Ġcheck ( site Ġ== Ġother . site ) Ġ{ Ġ" Merged ĠY ar ns Ġmust Ġhave Ġthe Ġsame Ġsite Ġidentifier ." Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġa Sequence Ġ= Ġelements . as Sequence () ĊĠĠĠĠĠĠĠ Ġval Ġb Sequence Ġ= Ġother . as Sequence () ĊĊĠĠĠĠĠĠĠ Ġval Ġmerged List Ġ= Ġsequence Of ( a Sequence , Ġb Sequence ). flatten () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct By Ġ{ Ġit . identifier Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . identifier . index Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠArrayList Ca usal Graph Y arn ( merged List , Ġsite ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove ( identifier : ĠC aus al Graph Identifier < S >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ: ĠMake Ġsure Ġthis Ġwork Ġproperly . ĊĠĠĠĠĠĠĠ Ġelements . removeAll Ġ{ Ġ(_, Ġi , Ġ_) Ġ-> Ġi Ġ== Ġidentifier Ġ} ĊĠĠĠĠĠĠĠ Ġelements . map Ġ{ Ġ( o , Ġi , Ġd ) Ġ-> Ġif Ġ( d . contains ( identifier )) Ġreturn @ map ĠC aus al Graph Atom ( o , Ġi , Ġd . minus ( identifier )) Ġelse ĠC aus al Graph Atom ( o , Ġi , Ġd ) Ġ} ĊĠĠĠ Ġ} Ċ }