package Ġorg . m if ek . w fc . topo logies čĊč Ċ import Ġorg . m if ek . w fc . datat ypes . Direction 2 D čĊč Ċ open Ġclass ĠCart esian 2 D Topology ( val Ġwidth : ĠInt , Ġval Ġheight : ĠInt , Ġoverride Ġval Ġperiodic : ĠBoolean Ġ= Ġfalse ) Ġ: čĊĠĠĠ ĠTop ology Ġ{ čĊĠĠĠ Ġoverride Ġval Ġtotal Size Ġ= Ġwidth Ġ* Ġheight čĊĠĠĠ Ġoverride Ġval Ġmax Degree Ġ= Ġ 4 čĊčĊĠĠĠ Ġfun Ġdeserialize Coordinates ( index : ĠInt ): ĠPair < Int , ĠInt > Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( index Ġ% Ġwidth , Ġindex Ġ/ Ġwidth ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġserialize Coordinates ( x : ĠInt , Ġy : ĠInt ): ĠInt Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġy Ġ* Ġwidth Ġ+ Ġx čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġneighbour Iterator ( index : ĠInt ): ĠSequence < Pair < Int , ĠInt >> Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġsequence Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( periodic Ġ|| Ġindex Ġ>= Ġwidth Ġ&& Ġheight Ġ> Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Pair ( Direction 2 D . NORTH . toInt (), Ġ( index Ġ- Ġwidth Ġ+ Ġtotal Size ) Ġ% Ġtotal Size )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( periodic Ġ|| Ġ( index Ġ+ Ġ 1 ) Ġ% Ġwidth Ġ!= Ġ 0 Ġ&& Ġwidth Ġ> Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Pair ( Direction 2 D . EAST . toInt (), Ġif Ġ(( index Ġ+ Ġ 1 ) Ġ% Ġwidth Ġ== Ġ 0 ) Ġindex Ġ+ Ġ 1 Ġ- Ġwidth Ġelse Ġindex Ġ+ Ġ 1 )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( periodic Ġ|| Ġindex Ġ< Ġtotal Size Ġ- Ġwidth Ġ&& Ġheight Ġ> Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Pair ( Direction 2 D . SO UTH . toInt (), Ġ( index Ġ+ Ġwidth ) Ġ% Ġtotal Size )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( periodic Ġ|| Ġindex Ġ% Ġwidth Ġ!= Ġ 0 Ġ&& Ġwidth Ġ> Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Pair ( Direction 2 D . WEST . toInt (), Ġif Ġ( index Ġ% Ġwidth Ġ== Ġ 0 ) Ġindex Ġ- Ġ 1 Ġ+ Ġwidth Ġelse Ġindex Ġ- Ġ 1 )) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }