package Ġnet . dbl sa iko . h ct m . common . graph Ċ Ċ class ĠGraph < N , ĠL > Ġ{ ĊĠ Ġvar Ġnodes : ĠSet < Node < N , ĠL >> Ġ= Ġempty Set () ĊĠĠĠ Ġprivate Ġset ĊĊĠ Ġfun Ġadd ( data : ĠN ): ĠNode < N , ĠL > Ġ{ ĊĠĠĠ Ġval Ġnode Ġ= ĠNode < N , ĠL >( data ) ĊĠĠĠ Ġnodes . forEach Ġ{ Ġit . on Added ( node ) Ġ} ĊĠĠĠ Ġnodes Ġ+= Ġnode ĊĠĠĠ Ġreturn Ġnode ĊĠ Ġ} ĊĊĠ Ġfun Ġremove ( node : ĠNode < N , ĠL >) Ġ{ ĊĠĠĠ Ġif Ġ( node Ġin Ġnodes ) Ġ{ ĊĠĠĠĠĠ Ġnodes Ġ-= Ġnode ĊĠĠĠĠĠ Ġnodes . forEach Ġ{ Ġit . on Removed ( node ) Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmove Bulk Unchecked ( into : ĠGraph < N , ĠL >, Ġnodes : ĠSet < Node < N , ĠL >>) Ġ{ ĊĠĠĠ Ġthis . nodes Ġ-= Ġnodes ĊĠĠĠ Ġinto . nodes Ġ+= Ġnodes ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRemoves Ġun connected Ġparts Ġof Ġthe Ġgraph Ġand Ġreturns Ġthem Ġas Ġnew Ġgraphs . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġsplit (): ĠSet < Graph < N , ĠL >> Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Set Of < Graph < N , ĠL >>() ĊĠĠĠ Ġval Ġto Be Checked Ġ= Ġnodes . to Mutable Set () ĊĠĠĠ Ġwhile Ġ( toBe Checked . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġconnected Ġ= Ġmutable Set Of < Node < N , ĠL >>() ĊĠĠĠĠĠ Ġfun Ġdesc end ( node : ĠNode < N , ĠL >) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnected Ġ+= Ġnode ĊĠĠĠĠĠĠĠ Ġto Be Checked Ġ-= Ġnode ĊĠĠĠĠĠĠĠ Ġfor Ġ( link Ġin Ġnode . connections ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġlink . other ( node ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġin Ġto Be Checked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesc end ( a ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġdesc end ( toBe Checked . first ()) ĊĊĠĠĠĠĠ Ġif Ġ( toBe Checked . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnet Ġ= ĠGraph < N , ĠL >() ĊĠĠĠĠĠĠĠ Ġmove Bulk Unchecked ( net , Ġconnected ) ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġnet ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġfun Ġjoin ( other : ĠGraph < N , ĠL >) Ġ{ ĊĠĠĠ Ġthis . nodes Ġ+= Ġother . nodes ĊĠĠĠ Ġother . nodes Ġ= Ġempty Set () ĊĠ Ġ} ĊĊĠ Ġfun Ġlink ( node 1 : ĠNode < N , ĠL >, Ġnode 2 : ĠNode < N , ĠL >, Ġdata : ĠL ): ĠLink < N , ĠL > Ġ{ ĊĠĠĠ Ġval Ġlink Ġ= ĠLink ( node 1 , Ġnode 2 , Ġdata ) ĊĠĠĠ Ġnode 1 . on Link ( link ) ĊĠĠĠ Ġnode 2 . on Link ( link ) ĊĠĠĠ Ġreturn Ġlink ĊĠ Ġ} ĊĊĠ Ġoperator Ġfun Ġcontains ( node : ĠNode < N , ĠL >) Ġ= Ġnode Ġin Ġnodes Ċ } Ċ Ċ data Ġclass ĠNode < N , ĠL >( val Ġdata : ĠN ) Ġ{ ĊĠ Ġvar Ġconnections : ĠSet < Link < N , ĠL >> Ġ= Ġempty Set () ĊĠĠĠ Ġ@ Jvm Synt hetic Ġinternal Ġset ĊĊĠ Ġfun Ġon Added ( node : ĠNode < N , ĠL >) Ġ{} ĊĊĠ Ġfun Ġon Removed ( node : ĠNode < N , ĠL >) Ġ{ ĊĠĠĠ Ġconnections Ġ= Ġconnections . filter Ġ{ Ġnode Ġ! in Ġit Ġ}. toSet () ĊĠ Ġ} ĊĊĠ Ġfun Ġon Link ( link : ĠLink < N , ĠL >) Ġ{ ĊĠĠĠ Ġconnections Ġ+= Ġlink ĊĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠLink < N , ĠL >( val Ġfirst : ĠNode < N , ĠL >, Ġval Ġsecond : ĠNode < N , ĠL >, Ġval Ġdata : ĠL ) Ġ{ ĊĠ Ġoperator Ġfun Ġcontains ( node : ĠNode < N , ĠL >) Ġ= Ġnode Ġ== Ġfirst Ġ|| Ġnode Ġ== Ġsecond ĊĊĠ Ġfun Ġother ( node : ĠNode < N , ĠL >) Ġ= Ġif Ġ( node Ġ== Ġsecond ) Ġfirst Ġelse Ġsecond Ċ }