@@ -73,11 +73,24 @@ pub fn matrix_cells(rows: u16, cols: u16) -> impl Iterator<Item = (usize, usize)
7373}
7474
7575pub fn empty_cells ( matrix : & Matrix , cols : u16 , rows : u16 ) -> Vec < ( usize , usize ) > {
76+ // TODO: Optimal solution is to use proper Matrix abstraction to derive empty cells
7677 matrix_cells ( rows, cols)
77- . filter ( |( row, col) | matrix. get ( * col) . and_then ( |col| col. get ( * row) ) . is_none ( ) )
78+ . filter ( |( row, col) | {
79+ matrix
80+ . get ( * col)
81+ . and_then ( |col| col. get ( * row) )
82+ . map ( |cell| cell. is_none ( ) )
83+ . unwrap_or ( true )
84+ } )
7885 . collect :: < Vec < ( usize , usize ) > > ( )
7986}
8087
88+ pub fn non_empty_cells_len ( matrix : & Matrix ) -> usize {
89+ matrix
90+ . iter ( )
91+ . fold ( 0usize , |sum, val| sum + val. iter ( ) . flatten ( ) . count ( ) )
92+ }
93+
8194fn get_cell ( ipfs : & Ipfs < DefaultParams > , cid : & Cid ) -> Result < Option < Cell > > {
8295 ipfs. get ( cid)
8396 . and_then ( |result| result. ipld ( ) )
@@ -451,40 +464,35 @@ mod tests {
451464 }
452465
453466 fn matrix_strategy ( ) -> impl Strategy < Value = Vec < Vec < Option < Vec < u8 > > > > > {
467+ let rows_len = ( 1 ..64usize ) . next ( ) . unwrap ( ) ;
454468 collection:: vec (
455- collection:: vec ( any :: < Option < Vec < u8 > > > ( ) , collection :: size_range ( 1 .. 64 ) ) ,
469+ collection:: vec ( any :: < Option < Vec < u8 > > > ( ) , rows_len ) ,
456470 collection:: size_range ( 1 ..64 ) ,
457471 )
458472 }
459473
460- fn non_empty_cells ( matrix : & Matrix , cols : u16 , rows : u16 ) -> Vec < ( usize , usize ) > {
461- matrix_cells ( rows as usize , cols as usize )
462- . filter ( |( row, col) | matrix. get ( * col) . and_then ( |col| col. get ( * row) ) . is_some ( ) )
463- . collect :: < Vec < ( usize , usize ) > > ( )
464- }
465-
466474 proptest ! {
467475 #[ test]
468- fn matrix_cells_length_is_correct( rows in 0usize ..1024 , cols in 0usize ..1024 ) {
469- prop_assert_eq!( matrix_cells( rows, cols) . count( ) , rows * cols) ;
476+ fn matrix_cells_length_is_correct( rows in 0u16 ..1024 , cols in 0u16 ..1024 ) {
477+ prop_assert_eq!( matrix_cells( rows, cols) . count( ) , rows as usize * cols as usize ) ;
470478 }
471479
472480 #[ test]
473481 fn empty_cells_length_is_correct( matrix in matrix_strategy( ) ) {
474- let cols = matrix. len( ) as u16 ;
475- let rows = matrix[ 0 ] . len( ) as u16 ;
476- let empty_cells_len = empty_cells( & matrix, cols, rows) . len( ) as u16 ;
477- let non_empty_cells_len = non_empty_cells ( & matrix, cols , rows ) . len ( ) as u16 ;
482+ let cols = matrix. len( ) ;
483+ let rows = matrix[ 0 ] . len( ) ;
484+ let empty_cells_len = empty_cells( & matrix, cols as u16 , rows as u16 ) . len( ) ;
485+ let non_empty_cells_len = non_empty_cells_len ( & matrix) ;
478486
479- prop_assert_eq!( empty_cells_len + non_empty_cells_len, rows * cols) ;
487+ prop_assert_eq!( empty_cells_len + non_empty_cells_len, ( rows * cols) as usize ) ;
480488 }
481489 }
482490
483491 #[ test_case( 1 , 1 => vec![ ( 0 , 0 ) ] ; "one cell" ) ]
484492 #[ test_case( 4 , 1 => vec![ ( 0 , 0 ) , ( 1 , 0 ) , ( 2 , 0 ) , ( 3 , 0 ) ] ; "four rows, one column" ) ]
485493 #[ test_case( 1 , 4 => vec![ ( 0 , 0 ) , ( 0 , 1 ) , ( 0 , 2 ) , ( 0 , 3 ) ] ; "four columns, one row" ) ]
486- #[ test_case( 2 , 2 => vec![ ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 0 ) , ( 1 , 1 ) ] ; "square matrix" ) ]
487- fn test_matrix_cells ( rows : usize , cols : usize ) -> Vec < ( usize , usize ) > {
494+ #[ test_case( 2 , 2 => vec![ ( 0 , 0 ) , ( 1 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) ] ; "square matrix" ) ]
495+ fn test_matrix_cells ( rows : u16 , cols : u16 ) -> Vec < ( usize , usize ) > {
488496 matrix_cells ( rows, cols) . collect :: < Vec < ( usize , usize ) > > ( )
489497 }
490498
0 commit comments