11use itertools:: Itertools ;
2- use std:: cmp;
32use std:: io:: { self , BufRead , Write } ;
43use std:: ops:: Range ;
54
@@ -11,31 +10,37 @@ pub fn write(
1110 vscale : f64 ,
1211 padding : Option < usize > ,
1312) -> io:: Result < ( ) > {
14- let mut frame = vec ! [ 0 ..0 ; 4 ] ;
15- for chunk in & reader
13+ let mut frame = [ 0 ..0 , 0 .. 0 , 0 .. 0 , 0 .. 0 ] ;
14+ reader
1615 . lines ( )
16+ . map ( |line| {
17+ line. map ( |line| {
18+ let beg = line. find ( |c : char | !c. is_whitespace ( ) ) . unwrap_or ( usize:: max_value ( ) ) ;
19+ let end = line. rfind ( |c : char | !c. is_whitespace ( ) ) . unwrap_or ( 0 ) ;
20+ ( beg, end)
21+ } )
22+ } )
1723 . enumerate ( )
1824 . map ( |( i, line) | ( scale ( i, vscale) , line) )
1925 . group_by ( |( i, _) | * i)
2026 . into_iter ( )
2127 . chunks ( 4 )
22- {
23- let mut chunk_size = 0 ;
24- for ( i, ( _, group) ) in chunk. enumerate ( ) {
25- let ( mut beg, mut end) = ( usize:: max_value ( ) , 0 ) ;
26- for ( _, line) in group {
27- let line: String = line?;
28- beg = cmp:: min ( beg, line. find ( |c : char | !c. is_whitespace ( ) ) . unwrap_or ( beg) ) ;
29- end = cmp:: max ( end, line. rfind ( |c : char | !c. is_whitespace ( ) ) . unwrap_or ( end) ) ;
28+ . into_iter ( )
29+ . try_for_each ( |chunk| {
30+ let mut chunk_size = 0 ;
31+ for ( i, ( _, group) ) in chunk. enumerate ( ) {
32+ let ( beg, end) = group
33+ . into_iter ( )
34+ . try_fold ( ( usize:: max_value ( ) , 0 ) , |( beg, end) , ( _, line) | {
35+ line. map ( |( b, e) | ( beg. min ( b) , end. max ( e) ) )
36+ } ) ?;
37+ frame[ i] = beg..( end + 1 ) ;
38+ chunk_size += 1 ;
3039 }
31- frame[ i] = beg..( end + 1 ) ;
32- chunk_size += 1 ;
33- }
34- frame. iter_mut ( ) . skip ( chunk_size) . for_each ( |row| * row = 0 ..0 ) ;
35- scale_frame ( & mut frame, hscale) ;
36- write_frame ( & mut writer, & frame, padding) ?;
37- }
38- Ok ( ( ) )
40+ frame. iter_mut ( ) . skip ( chunk_size) . for_each ( |row| * row = 0 ..0 ) ;
41+ scale_frame ( & mut frame, hscale) ;
42+ write_frame ( & mut writer, & frame, padding)
43+ } )
3944}
4045
4146/// Print minimap to the stdout.
@@ -94,7 +99,7 @@ fn write_frame(mut output: impl Write, frame: &[Range<usize>], padding: Option<u
9499}
95100
96101fn scale_frame ( frame : & mut [ Range < usize > ] , factor : f64 ) {
97- for x in frame. iter_mut ( ) {
102+ for x in frame {
98103 * x = scale ( x. start , factor) ..scale ( x. end , factor) ;
99104 }
100105}
0 commit comments