/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠW ely ab Ġda ĠSil va ĠPa ula Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . w ely ab . ank ob ach en Ċ Ċ class ĠMovement ation Exception ( message : ĠString ) Ġ: ĠChe ss Exception ( message ) Ċ Ċ class ĠMovement Flags ( ĊĠĠĠ Ġprivate Ġval Ġis Capture : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġis En Pass ant : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġis Cast ling : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġis Promotion : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġis Check : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġis Discovery : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġis Double : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġis Check mate : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġis St ale mate : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠCopy able < Movement Flags > Ġ{ ĊĠĠĠ Ġfun Ġis Capture () Ġ= Ġis Capture ĊĠĠĠ Ġfun Ġis En Pass ant () Ġ= Ġis En Pass ant ĊĠĠĠ Ġfun Ġis Cast ling () Ġ= Ġis Cast ling ĊĠĠĠ Ġfun Ġis Promotion () Ġ= Ġis Promotion ĊĠĠĠ Ġfun Ġis Check () Ġ= Ġis Check ĊĠĠĠ Ġfun Ġis Discovery () Ġ= Ġis Discovery ĊĠĠĠ Ġfun Ġis Double () Ġ= Ġis Double ĊĠĠĠ Ġfun Ġis Check mate () Ġ= Ġis Check mate ĊĠĠĠ Ġfun Ġis St ale mate () Ġ= Ġis St ale mate ĊĊĠĠĠ Ġoverride Ġfun Ġcopy () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĊĠĠĠĠĠĠĠ Ġarray ListOf < String >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" capture ". take If Ġ{ Ġis Capture Ġ} ?. let Ġ{ Ġthis . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" en Ġpass ant ". take If Ġ{ Ġis En Pass ant Ġ} ?. let Ġ{ Ġthis . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" cast ling ". take If Ġ{ Ġis Cast ling Ġ} ?. let Ġ{ Ġthis . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" promotion ". take If Ġ{ Ġis Promotion Ġ} ?. let Ġ{ Ġthis . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" check ". take If Ġ{ Ġis Check Ġ} ?. let Ġ{ Ġthis . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" discovery ". take If Ġ{ Ġis Discovery Ġ} ?. let Ġ{ Ġthis . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" double ". take If Ġ{ Ġis Double Ġ} ?. let Ġ{ Ġthis . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" check mate ". take If Ġ{ Ġis Check mate Ġ} ?. let Ġ{ Ġthis . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" st ale mate ". take If Ġ{ Ġis St ale mate Ġ} ?. let Ġ{ Ġthis . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. take If Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġit . reduce Ġ{ Ġs 1 , Ġs 2 Ġ-> Ġ"$ s 1 , Ġ$ s 2 " Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ" no Ġflags " Ċ } Ċ Ċ class ĠMovement Destination ( ĊĠĠĠ Ġprivate Ġval Ġtarget : ĠLocal ized Piece , ĊĠĠĠ Ġprivate Ġval Ġflags : ĠMovement Flags Ċ ) Ġ: ĠCopy able < Movement Destination > Ġ{ ĊĊĠĠĠ Ġfun Ġget Target () Ġ= Ġtarget ĊĠĠĠ Ġfun Ġget Flags () Ġ= Ġflags ĊĊĠĠĠ Ġoverride Ġfun Ġcopy () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= ĊĠĠĠĠĠĠĠ Ġtarget . toString (). let Ġ{ Ġtarget St rig n Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags . toString (). take If Ġ{ Ġit . isNotEmpty () Ġ} ?. let Ġ{ Ġflags String Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ target St rig n , Ġ$ flags String " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtarget St rig n ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠList < Movement Destination >. sum mar ize Flags () Ġ= ĊĠĠĠ Ġlet Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠ ĠMovement Metadata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġlist . forEach Ġ{ Ġadd ( it . get Flags ()) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} Ċ Ċ class ĠMovement Metadata Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġmov ements Counter : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġcaptures Counter : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġen Pass ants Counter : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġcast lings Counter : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġprom otions Counter : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġchecks Counter : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġdiscover ies Counter : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġdouble s Counter : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġcheck m ates Counter : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġprivate Ġval Ġstale m ates Counter : ĠLong Ġ= Ġ 0 Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġmov ements Count () Ġ= Ġmov ements Counter ĊĠĠĠ Ġfun Ġcaptures Count () Ġ= Ġcaptures Counter ĊĠĠĠ Ġfun Ġen Pass ants Count () Ġ= Ġen Pass ants Counter ĊĠĠĠ Ġfun Ġcast lings Count () Ġ= Ġcast lings Counter ĊĠĠĠ Ġfun Ġprom otions Count () Ġ= Ġprom otions Counter ĊĠĠĠ Ġfun Ġchecks Count () Ġ= Ġchecks Counter ĊĠĠĠ Ġfun Ġdiscover ies Count () Ġ= Ġdiscover ies Counter ĊĠĠĠ Ġfun Ġdouble s Count () Ġ= Ġdouble s Counter ĊĠĠĠ Ġfun Ġcheck m ates Count () Ġ= Ġcheck m ates Counter ĊĠĠĠ Ġfun Ġstale m ates Count () Ġ= Ġstale m ates Counter ĊĊĠĠĠ Ġclass ĠBuilder Ġinternal Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmov ements Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcaptures Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġen Pass ants Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcast lings Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġprom otions Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġchecks Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġdiscover ies Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġdouble s Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcheck m ates Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġstale m ates Counter Ġ= Ġ 0 L ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( flags : ĠMovement Flags ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Mov ements Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags . is Capture ()) Ġadd Capt ures Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags . is En Pass ant ()) Ġadd En Pass ants Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags . is Cast ling ()) Ġadd Cast lings Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags . is Promotion ()) Ġadd Prom otions Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags . is Check ()) Ġadd Checks Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags . is Discovery ()) Ġadd Discover ies Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags . is Double ()) Ġadd Doubles Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags . is Check mate ()) Ġadd Check m ates Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flags . is St ale mate ()) Ġadd St ale m ates Count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( metadata : ĠMovement Metadata ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Mov ements Count ( metadata . mov ements Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Capt ures Count ( metadata . capt ures Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd En Pass ants Count ( metadata . en Pass ants Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Cast lings Count ( metadata . cast lings Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Prom otions Count ( metadata . prom otions Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Checks Count ( metadata . checks Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Discover ies Count ( metadata . discover ies Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Doubles Count ( metadata . double s Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Check m ates Count ( metadata . check m ates Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd St ale m ates Count ( metadata . st ale m ates Counter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Mov ements Count ( mov ements Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mov ements Counter Ġ+= Ġmov ements Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Capt ures Count ( capt ures Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . capt ures Counter Ġ+= Ġcaptures Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd En Pass ants Count ( en Pass ants Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . en Pass ants Counter Ġ+= Ġen Pass ants Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Cast lings Count ( cast lings Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . cast lings Counter Ġ+= Ġcast lings Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Prom otions Count ( prom otions Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . prom otions Counter Ġ+= Ġprom otions Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Checks Count ( checks Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . checks Counter Ġ+= Ġchecks Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Discover ies Count ( discover ies Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . discover ies Counter Ġ+= Ġdiscover ies Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Doubles Count ( double s Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . double s Counter Ġ+= Ġdouble s Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Check m ates Count ( check m ates Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . check m ates Counter Ġ+= Ġcheck m ates Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd St ale m ates Count ( st ale m ates Count : ĠLong Ġ= Ġ 1 ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . st ale m ates Counter Ġ+= Ġstale m ates Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild () Ġ= ĠMovement Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmov ements Counter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaptures Counter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġen Pass ants Counter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcast lings Counter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprom otions Counter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecks Counter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiscover ies Counter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble s Counter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck m ates Counter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstale m ates Counter ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġappend (" mov ements Ġ= Ġ"). append ( mov ements Counter ). append (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" capt ures Ġ= Ġ"). append ( capt ures Counter ). append (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" en Pass ants Ġ= Ġ"). append ( en Pass ants Counter ). append (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" cast lings Ġ= Ġ"). append ( cast lings Counter ). append (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" prom otions Ġ= Ġ"). append ( prom otions Counter ). append (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" checks Ġ= Ġ"). append ( checks Counter ). append (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" discover ies Ġ= Ġ"). append ( discover ies Counter ). append (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" double s Ġ= Ġ"). append ( double s Counter ). append (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" check m ates Ġ= Ġ"). append ( check m ates Counter ). append (", Ġ") ĊĠĠĠĠĠĠĠ Ġappend (" st ale m ates Ġ= Ġ"). append ( st ale m ates Counter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbuilder () Ġ= ĠBuilder () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPiece Movement ( ĊĠĠĠ Ġprivate Ġval Ġorigin : ĠLocal ized Piece , ĊĠĠĠ Ġprivate Ġval Ġdestination : ĠMovement Destination Ċ ) Ġ: ĠCopy able < Piece Movement > Ġ{ ĊĊĠĠĠ Ġfun Ġget Origin () Ġ= ĊĠĠĠĠĠĠĠ Ġorigin ĊĊĠĠĠ Ġfun Ġget Destination () Ġ= ĊĠĠĠĠĠĠĠ Ġdestination ĊĊĠĠĠ Ġfun Ġget Flags () Ġ= ĊĠĠĠĠĠĠĠ Ġdestination . get Flags () ĊĊĠĠĠ Ġoverride Ġfun Ġcopy () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ origin . position . getS an Not ation ()} Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" -> Ġ${ destination . getTarget (). position . getS an Not ation ()} =${ destination . getTarget (). piece . letter }, Ġ${ get Flags () }" Ċ } Ċ Ċ class ĠPiece Mov ements ( ĊĠĠĠ Ġprivate Ġval Ġorigin : ĠLocal ized Piece , ĊĠĠĠ Ġprivate Ġval Ġdest inations : ĠList < Movement Destination >, ĊĠĠĠ Ġprivate Ġval Ġmetadata : ĠMovement Metadata Ċ ) Ġ: ĠCopy able < Piece Mov ements > Ġ{ ĊĠĠĠ Ġfun Ġget Origin () Ġ= Ġorigin ĊĊĠĠĠ Ġfun Ġget Dest inations Count () Ġ= ĊĠĠĠĠĠĠĠ Ġdest inations . size ĊĊĠĠĠ Ġfun Ġget Metadata () Ġ= ĊĠĠĠĠĠĠĠ Ġmetadata ĊĊĠĠĠ Ġfun ĠisEmpty () Ġ= ĊĠĠĠĠĠĠĠ Ġdest inations . isEmpty () ĊĊĠĠĠ Ġfun Ġis NotEmpty () Ġ= ĊĠĠĠĠĠĠĠ Ġdest inations . isNotEmpty () ĊĊĠĠĠ Ġfun Ġget Destination ( index : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġdest inations [ index ] ĊĊĠĠĠ Ġfun Ġas Sequence Of Dest inations () Ġ= ĊĠĠĠĠĠĠĠ Ġdest inations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPiece Movement ( origin , Ġit ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcopy () Ġ= ĊĠĠĠĠĠĠĠ Ġthis ĊĊĠĠĠ Ġfun ĠforEach Destination ( action : Ġ( origin : ĠLocal ized Piece , Ġdestination : ĠMovement Destination ) Ġ-> ĠUnit ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġas Sequence Of Dest inations (). forEach Ġ{ Ġaction ( it . get Origin (), Ġit . get Destination ()) Ġ} Ċ } Ċ Ċ fun ĠList < Piece Mov ements >. sum mar ize Metadata () Ġ= ĊĠĠĠ Ġlet Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠ ĠMovement Metadata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġlist . forEach Ġ{ Ġadd ( it . getMetadata ()) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} Ċ Ċ class ĠMov ements ( ĊĠĠĠ Ġprivate Ġval Ġorig ins : ĠList < Piece Mov ements >, ĊĠĠĠ Ġprivate Ġval Ġmetadata : ĠMovement Metadata Ċ ) Ġ: ĠIterable < Piece Movement > Ġ{ ĊĊĠĠĠ Ġfun Ġget Orig ins Count () Ġ= ĊĠĠĠĠĠĠĠ Ġorig ins . size ĊĊĠĠĠ Ġfun Ġget Metadata () Ġ= ĊĠĠĠĠĠĠĠ Ġmetadata ĊĊĠĠĠ Ġfun ĠisEmpty () Ġ= ĊĠĠĠĠĠĠĠ Ġorig ins . isEmpty () ĊĊĠĠĠ Ġfun Ġis NotEmpty () Ġ= ĊĠĠĠĠĠĠĠ Ġorig ins . isNotEmpty () ĊĊĠĠĠ Ġfun Ġget Dest inations Count () Ġ= ĊĠĠĠĠĠĠĠ Ġas Sequence Of Orig ins (). map Ġ{ Ġit . get Dest inations Count () Ġ}. sum () ĊĊĠĠĠ Ġfun Ġget Piece Movement ( index : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġorig ins [ index ] ĊĊĠĠĠ Ġfun Ġas Sequence Of Orig ins () Ġ= ĊĠĠĠĠĠĠĠ Ġorig ins . as Sequence () ĊĊĠĠĠ Ġfun ĠforEach Origin ( action : Ġ( origin : ĠPiece Mov ements ) Ġ-> ĠUnit ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġas Sequence Of Orig ins (). forEach Ġ{ Ġpiece Movement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . invoke ( piece Movement ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġto List Dest inations () Ġ= ĊĠĠĠĠĠĠĠ Ġas Sequence Of Dest inations (). toList () ĊĊĠĠĠ Ġfun Ġas Sequence Of Dest inations () Ġ= ĊĠĠĠĠĠĠĠ Ġas Sequence Of Orig ins () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . as Sequence Of Dest inations () Ġ} ĊĊĠĠĠ Ġfun ĠforEach Destination ( action : Ġ( piece Movement : ĠPiece Movement ) Ġ-> ĠUnit ): ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġas Sequence Of Dest inations (). forEach Ġ{ Ġaction . invoke ( it ) Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( mov ements : ĠMov ements ) Ġ= ĊĠĠĠĠĠĠĠ ĠMov ements ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorig ins Ġ+ Ġmov ements . orig ins , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMovement Metadata . builder (). add ( metadata ). add ( mov ements . metadata ). build () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġiterator () Ġ= ĊĠĠĠĠĠĠĠ Ġas Sequence Of Dest inations (). iterator () Ċ } Ċ