use std::{fmt::Display, fs, time::Instant}; use anyhow::Result; pub fn run(name: &str, path: &str, parse: P, part1: F1, part2: F2) -> Result<()> where T: Clone, U: Display, V: Display, P: Fn(&str) -> T, F1: Fn(T) -> U, F2: Fn(T) -> V, { println!("{}\n{}\n", name, "-".repeat(name.len())); let read_timer = Instant::now(); let input = fs::read_to_string(path)?; println!("Read input in: {:?}", read_timer.elapsed()); let parse_timer = Instant::now(); let input = parse(&input); println!("Parsed input in: {:?}\n", parse_timer.elapsed()); let part1_timer = Instant::now(); println!("Part 1 answer: {}", part1(input.clone())); println!("Finished in: {:?}\n", part1_timer.elapsed()); let part2_timer = Instant::now(); println!("Part 2 answer: {}", part2(input.clone())); println!("Finished in: {:?}", part2_timer.elapsed()); Ok(()) }