Advent of Code for 2025!
1use std::{fmt::Display, fs, time::Instant};
2
3use anyhow::Result;
4
5pub fn run<T, U, V, P, F1, F2>(name: &str, path: &str, parse: P, part1: F1, part2: F2) -> Result<()>
6where
7 T: Clone,
8 U: Display,
9 V: Display,
10 P: Fn(&str) -> T,
11 F1: Fn(T) -> U,
12 F2: Fn(T) -> V,
13{
14 println!("{}\n{}\n", name, "-".repeat(name.len()));
15
16 let read_timer = Instant::now();
17 let input = fs::read_to_string(path)?;
18 println!("Read input in: {:?}", read_timer.elapsed());
19
20 let parse_timer = Instant::now();
21 let input = parse(&input);
22 println!("Parsed input in: {:?}\n", parse_timer.elapsed());
23
24 let part1_timer = Instant::now();
25 println!("Part 1 answer: {}", part1(input.clone()));
26 println!("Finished in: {:?}\n", part1_timer.elapsed());
27
28 let part2_timer = Instant::now();
29 println!("Part 2 answer: {}", part2(input.clone()));
30 println!("Finished in: {:?}", part2_timer.elapsed());
31
32 Ok(())
33}