package Ġru . am ai . study . cour ser a . kotlin . week 4 . board Ċ Ċ import Ġru . am ai . study . cour ser a . kotlin . week 4 . board . Direction .* Ċ Ċ private Ġclass ĠSquare Board Impl ( override Ġval Ġwidth : ĠInt ): ĠSquare Board Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġboard : ĠMap < Pair < Int , ĠInt >, ĠCell > Ġ= ĊĠĠĠĠĠĠĠ Ġ( 1 .. width ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ-> Ġ( 1 .. width ). map Ġ{ Ġj Ġ-> Ġ( i Ġto Ġj ) Ġto ĠCell ( i , Ġj ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toMap () ĊĊĠĠĠ Ġoverride Ġfun Ġget Cell OrNull ( i : ĠInt , Ġj : ĠInt ): ĠCell ? Ġ= Ġboard [ i Ġto Ġj ] ĊĊĠĠĠ Ġoverride Ġfun Ġget Cell ( i : ĠInt , Ġj : ĠInt ): ĠCell Ġ= Ġget Cell OrNull ( i , Ġj ) Ġ?: ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("$ i Ġand Ġ$ j Ġshould Ġbe Ġbetween Ġ 0 Ġand Ġ${ width - 1 }") ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Cells (): ĠCollection < Cell > Ġ= Ġboard . values ĊĊĠĠĠ Ġoverride Ġfun Ġget Row ( i : ĠInt , Ġj Range : ĠInt Progress ion ): ĠList < Cell > Ġ= ĊĠĠĠĠĠĠĠ Ġj Range . map Ġ{ Ġj Ġ-> Ġi Ġto Ġj Ġ}. map NotNull ( board :: get ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Column ( i Range : ĠInt Progress ion , Ġj : ĠInt ): ĠList < Cell > Ġ= ĊĠĠĠĠĠĠĠ Ġi Range . map Ġ{ Ġi Ġ-> Ġi Ġto Ġj Ġ}. map NotNull ( board :: get ) ĊĊĠĠĠ Ġoverride Ġfun ĠCell . get Ne ighbour ( direction : ĠDirection ): ĠCell ? Ġ= Ġwhen ( direction ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDOWN Ġ-> Ġboard [ i + 1 Ġto Ġj ] ĊĠĠĠĠĠĠĠ ĠUP Ġ-> Ġboard [ i - 1 Ġto Ġj ] ĊĠĠĠĠĠĠĠ ĠRIGHT Ġ-> Ġboard [ i Ġto Ġj + 1 ] ĊĠĠĠĠĠĠĠ ĠLEFT Ġ-> Ġboard [ i Ġto Ġj - 1 ] ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠGame Board Impl < T >( board : ĠSquare Board ): ĊĠĠĠ ĠGame Board < T >, ĠSquare Board Ġby Ġboard Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcell To Value Map : ĠMutable Map < Cell , ĠT ?> Ġ= ĊĠĠĠĠĠĠĠ ĠgetAll Cells (). associate With To ( mutable Map Of (), Ġ{ Ġnull Ġ}) ĊĊĠĠĠ Ġprivate Ġval Ġcell Values : ĠMutable Collection < T ?> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcell To Value Map . values ĊĊĠĠĠ Ġoverride Ġfun Ġget ( cell : ĠCell ): ĠT ? Ġ= Ġcell To Value Map [ cell ] ĊĊĠĠĠ Ġoverride Ġfun Ġset ( cell : ĠCell , Ġvalue : ĠT ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcell To Value Map [ cell ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfilter ( predicate : Ġ( T ?) Ġ-> ĠBoolean ): ĠCollection < Cell > Ġ= ĊĠĠĠĠĠĠĠ Ġcell To Value Map . filter Values ( predicate ). keys ĊĊĠĠĠ Ġoverride Ġfun Ġfind ( predicate : Ġ( T ?) Ġ-> ĠBoolean ): ĠCell ? Ġ= Ġfilter ( predicate ). first () ĊĊĠĠĠ Ġoverride Ġfun Ġany ( predicate : Ġ( T ?) Ġ-> ĠBoolean ): ĠBoolean Ġ= Ġcell Values . any ( predicate ) ĊĊĠĠĠ Ġoverride Ġfun Ġall ( predicate : Ġ( T ?) Ġ-> ĠBoolean ): ĠBoolean Ġ= Ġcell Values . all ( predicate ) Ċ } Ċ Ċ fun Ġcreate Square Board ( width : ĠInt ): ĠSquare Board Ġ= ĠSquare Board Impl ( width ) Ċ fun Ġ< T > Ġcreate Game Board ( width : ĠInt ): ĠGame Board < T > Ġ= ĠGame Board Impl ( create Square Board ( width )) ĊĊ