chunker 0.1.5

Minimalistic parallel executor
Documentation
use std::{collections::HashMap, io::{stdin, stdout, Read, Write, BufWriter}, cmp::Reverse};

fn main() {
	let mut text = String::new();
	stdin().read_to_string(&mut text).unwrap();
	let lower = text.to_ascii_lowercase();
	let lines: Vec<_> = lower.lines().collect();

	let word_counts = chunker::run(
		&lines,
		chunker::Config { chunk_size: 10_000, ..Default::default() },
		|| HashMap::<&str, u32>::new(),
		|counts, line| {
			for word in line.split_whitespace() {
				*counts.entry(word).or_default() += 1;
			}
		},
		|rx| rx.into_iter().reduce(|mut word_counts, counts| {
			for (word, count) in counts {
				*word_counts.entry(word).or_default() += count;
			}

			word_counts
		}).unwrap(),
	);

	let mut sorted_word_counts = Vec::from_iter(word_counts);
	sorted_word_counts.sort_unstable_by_key(|&(_, count)| Reverse(count));
	let mut stdout = BufWriter::new(stdout().lock());

	for (word, count) in sorted_word_counts {
		writeln!(stdout, "{word} {count}").unwrap();
	}
}