package Ġcom . l ro z ans ki . generator . d ungeon . map Ċ Ċ import Ġcom . l ro z ans ki . generator . d ungeon . map . data . Grid Rect Ċ import Ġcom . l ro z ans ki . generator . d ungeon . map . data . Position Ċ import Ġcom . l ro z ans ki . generator . d ungeon . map . data . Size Ċ Ċ abstract Ġclass ĠAbstract Grid < T >( val Ġsize : ĠSize ) Ġ{ ĊĊĠĠĠ Ġval Ġgrid : ĠArray < Array < T >> Ġ= Ġthis . create Grid () ĊĊĠĠĠ Ġabstract Ġfun Ġcreate Grid (): ĠArray < Array < T >> ĊĊĠĠĠ Ġoperator Ġfun Ġget ( x : ĠInt , Ġy : ĠInt ): ĠT ? Ġ= Ġif Ġ( contains ( x , Ġy )) Ġgrid [ x ][ y ] Ġelse Ġnull ĊĠĠĠ Ġoperator Ġfun Ġget ( position : ĠPosition ): ĠT ? Ġ= Ġget ( position . x , Ġposition . y ) ĊĊĠĠĠ Ġopen Ġoperator Ġfun Ġset ( x : ĠInt , Ġy : ĠInt , Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( contains ( x , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrid [ x ][ y ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( position : ĠPosition , Ġvalue : ĠT ) Ġ= Ġset ( position . x , Ġposition . y , Ġvalue ) ĊĊĠĠĠ Ġabstract Ġfun Ġis Rectangle Empty ( position : ĠPosition , Ġsize : ĠSize ): ĠBoolean ĊĊĠĠĠ Ġfun Ġcontains ( x : ĠInt , Ġy : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġx Ġ>= Ġ 0 Ġ&& Ġx Ġ<= Ġgrid . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġy Ġ>= Ġ 0 Ġ&& Ġy Ġ<= Ġgrid [ x ]. size Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Edge ( position : ĠPosition ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġposition . x Ġ== Ġ 0 Ġ|| Ġposition . x Ġ== Ġgrid . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġposition . y Ġ== Ġ 0 Ġ|| Ġposition . y Ġ== Ġgrid . size Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġall Match ( position : ĠPosition , Ġsize : ĠSize , Ġpredicate : Ġ( cell : ĠT ) Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġposition . x .. position . x Ġ+ Ġsize . w ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġposition . y .. position . y Ġ+ Ġsize . h ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! predicate ( this [ x , Ġy ] !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġany Match ( position : ĠPosition , Ġsize : ĠSize , Ġpredicate : Ġ( cell : ĠT ) Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġposition . x .. position . x Ġ+ Ġsize . w ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġposition . y .. position . y Ġ+ Ġsize . h ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( predicate ( this [ x , Ġy ] !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠforEach Cell ( action : Ġ( cell : ĠT ) Ġ-> ĠUnit ) Ġ= ĠforEach Cell ( Position . zero , ĠSize ( size . w Ġ- Ġ 1 , Ġsize . h Ġ- Ġ 1 ), Ġaction ) ĊĠĠĠ Ġfun ĠforEach Cell ( grid Rect : ĠGrid Rect < T >, Ġaction : Ġ( cell : ĠT ) Ġ-> ĠUnit ) Ġ= ĠforEach Cell ( grid Rect . position , Ġgrid Rect . size , Ġaction ) ĊĊĠĠĠ Ġprivate Ġfun ĠforEach Cell ( position : ĠPosition , Ġsize : ĠSize , Ġaction : Ġ( cell : ĠT ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġposition . x .. position . x Ġ+ Ġsize . w ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġposition . y .. position . y Ġ+ Ġsize . h ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( this [ x , Ġy ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfilter ( predicate : Ġ( cell : ĠT ) Ġ-> ĠBoolean ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcell List Ġ= Ġmutable ListOf < T >() ĊĊĠĠĠĠĠĠĠ ĠforEach Cell Ġ{ Ġcell Ġ-> Ġcell . take If ( predicate )?. apply Ġ{ Ġcell List . add ( this ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcell List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġfill ( initializer : Ġ( x : ĠInt , Ġy : ĠInt ) Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġsize . w ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġsize . h ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrid [ x ][ y ] Ġ= Ġinitializer ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ