type Timestamp = String; fn compute_usage(lines: R) -> Result<(u32, Vec), E> where S: AsRef, R: Iterator>, { let mut timestamps = Vec::new(); let mut current = 0; let mut maximum = 0; for line in lines { let line = line?; let line = line.as_ref(); if line.starts_with("License IN") { current -= 1; } else if line.starts_with("License OUT") { current += 1; if maximum <= current { let date = line.split_whitespace().nth(3).unwrap().to_string(); if maximum < current { maximum = current; timestamps.clear(); } timestamps.push(date); } } } Ok((maximum, timestamps)) } fn main() -> std::io::Result<()> { use std::io::{BufRead, BufReader}; let file = std::fs::OpenOptions::new().read(true).open("mlijobs.txt")?; let (max, timestamps) = compute_usage(BufReader::new(file).lines())?; println!("Maximum licenses out: {}", max); println!("At time(s): {:?}", timestamps); Ok(()) }