1
1
use itertools:: Itertools ;
2
- use std:: cmp;
3
2
use std:: io:: { self , BufRead , Write } ;
4
3
use std:: ops:: Range ;
5
4
@@ -11,31 +10,37 @@ pub fn write(
11
10
vscale : f64 ,
12
11
padding : Option < usize > ,
13
12
) -> 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
16
15
. 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
+ } )
17
23
. enumerate ( )
18
24
. map ( |( i, line) | ( scale ( i, vscale) , line) )
19
25
. group_by ( |( i, _) | * i)
20
26
. into_iter ( )
21
27
. 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 ;
30
39
}
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
+ } )
39
44
}
40
45
41
46
/// Print minimap to the stdout.
@@ -94,7 +99,7 @@ fn write_frame(mut output: impl Write, frame: &[Range<usize>], padding: Option<u
94
99
}
95
100
96
101
fn scale_frame ( frame : & mut [ Range < usize > ] , factor : f64 ) {
97
- for x in frame. iter_mut ( ) {
102
+ for x in frame {
98
103
* x = scale ( x. start , factor) ..scale ( x. end , factor) ;
99
104
}
100
105
}
0 commit comments