diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs index d49266b..a4501cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,24 +17,42 @@ type Map = BTreeMap<&'static str, String>; fn main() -> io::Result<()> { + let nproc = 4; for dirname in env::args().skip(1) { - let maps: Vec<DirEntry> = WalkDir::new(&dirname) - .into_iter() - .filter_map(|e| e.ok()) - .collect(); - let maps: Vec<Map> = maps - .into_par_iter() - .map(mkmap) - .collect(); - for map in maps { - println!("{}", serde_yaml::to_string(&map).unwrap()); - } + summain(&dirname, nproc); } Ok(()) } -fn mkmap(e: DirEntry) -> Map { +fn summain(dirname: &str, nproc: usize) { + let mut chunk: Vec<DirEntry> = vec![]; + let entries = WalkDir::new(dirname) + .into_iter() + .filter_map(|e| e.ok()); + + for entry in entries { + chunk.push(entry); + if chunk.len() == nproc { + process_chunk(&chunk); + } + } + + if chunk.len() > 0 { + process_chunk(&chunk); + } +} + + +fn process_chunk(chunk: &[DirEntry]) { + let chunk: Vec<Map> = chunk.into_par_iter().map(mkmap).collect(); + for map in chunk { + print_map(map); + } +} + + +fn mkmap(e: &DirEntry) -> Map { let fields = vec![ ("Name", format::name(&e)), ("Mtime", format::mtime(&e)), @@ -58,3 +76,7 @@ fn mkmap(e: DirEntry) -> Map { } map } + +fn print_map(map: Map) { + println!("{}", serde_yaml::to_string(&map).unwrap()); +} |