package Ġto mas vol ker . num er iko . core . interfaces . array 2 d . generic Ċ Ċ import Ġto mas vol ker . num er iko . core . interfaces . factory . array 2 D Of Null s Ċ import Ġto mas vol ker . num er iko . core . pre conditions . require Same Shape Ċ Ċ fun Ġ< T > ĠArray 2 D < T >. toList Of Lists (): ĠList < List < T >> Ġ= ĊĠĠĠĠĠĠĠ ĠList ( shape 0 ) Ġ{ Ġi 0 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( shape 1 ) Ġ{ Ġi 1 Ġ-> Ġthis . getValue ( i 0 , Ġi 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ inline Ġfun Ġ< T > ĠArray 2 D < T >. forEach Index ( operation : Ġ( i 0 : ĠInt , Ġi 1 : ĠInt ) Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġfor Ġ( i 0 Ġin Ġ 0 Ġuntil Ġshape 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i 1 Ġin Ġ 0 Ġuntil Ġshape 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation ( i 0 , Ġi 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ inline Ġfun Ġ< T , ĠR > Ġelement Wise ( source : ĠArray 2 D < T >, Ġdestination : ĠMutable Array 2 D < R >, Ġoperation : Ġ( T ) Ġ-> ĠR ) Ġ{ ĊĠĠĠ Ġrequire Same Shape ( source , Ġdestination ) ĊĠĠĠ Ġsource . forEach Index Ġ{ Ġi 0 , Ġi 1 Ġ-> ĊĠĠĠĠĠĠĠ Ġdestination . setValue ( operation ( source . getValue ( i 0 , Ġi 1 )), Ġi 0 , Ġi 1 ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ inline Ġfun Ġ< T 1 , ĠT 2 , ĠR > Ġelement Wise ( source 1 : ĠArray 2 D < T 1 >, Ġsource 2 : ĠArray 2 D < T 2 >, Ġdestination : ĠMutable Array 2 D < R >, Ġoperation : Ġ( T 1 , ĠT 2 ) Ġ-> ĠR ) Ġ{ ĊĠĠĠ Ġrequire Same Shape ( source 1 , Ġsource 2 ) ĊĠĠĠ Ġrequire Same Shape ( source 1 , Ġdestination ) ĊĠĠĠ Ġsource 1 . forEach Index Ġ{ Ġi 0 , Ġi 1 Ġ-> ĊĠĠĠĠĠĠĠ Ġdestination . setValue ( operation ( source 1 . getValue ( i 0 , Ġi 1 ), Ġsource 2 . getValue ( i 0 , Ġi 1 )), Ġi 0 , Ġi 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T , ĠR > ĠArray 2 D < T >. element Wise ( operation : Ġ( T ) Ġ-> ĠR ): ĠArray 2 D < R > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġarray 2 D Of Null s < R >( shape 0 , Ġshape 1 ). as Mutable () ĊĠĠĠ Ġelement Wise ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Ġ= Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= Ġoperation ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġresult Ġas ĠArray 2 D < R > Ċ } Ċ Ċ inline Ġfun Ġ< T , ĠA : ĠMutable Array 2 D < T >> ĠA . apply Map ( operation : Ġ( T ) Ġ-> ĠT ): ĠA Ġ{ ĊĠĠĠ Ġelement Wise ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= Ġoperation ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ inline Ġfun Ġ< T 1 , ĠT 2 , ĠR > Ġelement Wise ( array 1 : ĠArray 2 D < T 1 >, Ġarray 2 : ĠArray 2 D < T 2 >, Ġoperation : Ġ( T 1 , ĠT 2 ) Ġ-> ĠR ): ĠArray 2 D < R > Ġ{ ĊĠĠĠ Ġrequire Same Shape ( array 1 , Ġarray 2 ) ĊĊĠĠĠ Ġval Ġresult Ġ= Ġarray 2 D Of Null s < R >( array 1 . shape 0 , Ġarray 1 . shape 1 ). as Mutable () ĊĠĠĠ Ġelement Wise ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource 1 Ġ= Ġarray 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource 2 Ġ= Ġarray 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Ġ= Ġresult , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= Ġoperation ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġresult Ġas ĠArray 2 D < R > Ċ Ċ } Ċ Ċ inline Ġfun Ġ< T , ĠA : ĠMutable Array 2 D < T >> ĠA . apply Element Wise ( other : ĠArray 2 D < T >, Ġoperation : Ġ( T , ĠT ) Ġ-> ĠT ): ĠA Ġ{ ĊĠĠĠ Ġrequire Same Shape ( this , Ġother ) ĊĠĠĠ Ġelement Wise ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource 1 Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource 2 Ġ= Ġother , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= Ġoperation ĊĠĠĠ Ġ) ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ fun ĠArray 2 D <* >. is Square (): ĠBoolean Ġ= Ġshape 0 Ġ== Ġshape 1