@@ -22,7 +22,6 @@ impl<T> Grid<T> {
2222 content : vec ! [ default ; width * height] ,
2323 }
2424 }
25-
2625 #[ inline]
2726 pub fn new_from_str < F > ( input : & str , map_char : F ) -> Self
2827 where
@@ -48,7 +47,7 @@ impl<T> Grid<T> {
4847 pub fn new_from_str_capture_start (
4948 input : & str ,
5049 map_char : & dyn Fn ( char ) -> T ,
51- is_start : & dyn Fn ( T ) -> bool ,
50+ is_start : & dyn Fn ( char ) -> bool ,
5251 ) -> ( Self , Point )
5352 where
5453 T : From < char > + Copy ,
@@ -59,7 +58,7 @@ impl<T> Grid<T> {
5958 let mut start = None ;
6059 for ( i, c) in input. chars ( ) . filter ( |& c| c != '\n' ) . enumerate ( ) {
6160 let t = map_char ( c) ;
62- if is_start ( t ) {
61+ if is_start ( c ) {
6362 start = Some ( Point :: new_usize ( i / width, i % width) ) ;
6463 }
6564 content. push ( t) ;
@@ -160,6 +159,13 @@ impl<T> Grid<T> {
160159 }
161160}
162161
162+ impl Grid < char > {
163+ #[ inline]
164+ pub fn new_char_grid_from_str ( input : & str ) -> Self {
165+ Self :: new_from_str ( input, |c| c)
166+ }
167+ }
168+
163169impl < T > Grid < T > {
164170 #[ inline]
165171 pub fn is_in_bounds ( & self , point : Point ) -> bool {
@@ -254,6 +260,22 @@ impl<T: std::fmt::Display> std::fmt::Display for Grid<T> {
254260 }
255261}
256262
263+ impl < T : std:: fmt:: Display > std:: fmt:: Debug for Grid < T > {
264+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
265+ write ! ( f, "{}" , self )
266+ }
267+ }
268+
269+ impl < T : PartialEq > Grid < T > {
270+ #[ inline]
271+ pub fn find_position_of ( & self , item : & T ) -> Option < Point > {
272+ self . content
273+ . iter ( )
274+ . position ( |t| * t == * item)
275+ . map ( |i| Point :: new_usize ( i / self . width , i % self . width ) )
276+ }
277+ }
278+
257279#[ cfg( test) ]
258280mod tests {
259281 use super :: * ;
@@ -517,4 +539,27 @@ mod tests {
517539 assert_eq ! ( grid. content[ 2 ] , '8' ) ;
518540 assert_eq ! ( grid. content[ 3 ] , '9' ) ;
519541 }
542+
543+ #[ test]
544+ pub fn test_grid_get_item ( ) {
545+ let grid = Grid :: new_from_str ( "123\n 456\n 789" , & |c| c) ;
546+ assert_eq ! ( grid. get_item( Point :: new( 0 , 0 ) ) , Some ( & '1' ) ) ;
547+ assert_eq ! ( grid. get_item( Point :: new( 0 , 1 ) ) , Some ( & '2' ) ) ;
548+ assert_eq ! ( grid. get_item( Point :: new( 0 , 2 ) ) , Some ( & '3' ) ) ;
549+ }
550+
551+ #[ test]
552+ pub fn test_grid_get_item_out_of_bounds ( ) {
553+ let grid = Grid :: new_from_str ( "123\n 456\n 789" , & |c| c) ;
554+ assert_eq ! ( grid. get_item( Point :: new( 3 , 0 ) ) , None ) ;
555+ assert_eq ! ( grid. get_item( Point :: new( 0 , 3 ) ) , None ) ;
556+ }
557+
558+ #[ test]
559+ pub fn test_grid_find_position_of ( ) {
560+ let grid = Grid :: new_from_str ( "123\n 456\n 789" , & |c| c) ;
561+ assert_eq ! ( grid. find_position_of( & '1' ) , Some ( Point :: new( 0 , 0 ) ) ) ;
562+ assert_eq ! ( grid. find_position_of( & '2' ) , Some ( Point :: new( 0 , 1 ) ) ) ;
563+ assert_eq ! ( grid. find_position_of( & '3' ) , Some ( Point :: new( 0 , 2 ) ) ) ;
564+ }
520565}
0 commit comments