diff --git a/2021/src/lib.rs b/2021/src/lib.rs index a1e97b4..dbe3b59 100644 --- a/2021/src/lib.rs +++ b/2021/src/lib.rs @@ -1,15 +1,47 @@ -use std::io::{BufReader, BufRead}; +use std::io::Read; +use std::str::FromStr; use std::fs::File; -use color_eyre::eyre; +use color_eyre::{eyre}; -pub fn iter_nums(filename: &str) -> eyre::Result< impl Iterator> > { - let file = File::open(filename)?; - let reader = BufReader::new(file); +pub fn load(filename: &str) -> eyre::Result { + let mut file = File::open(filename)?; + let mut data = String::new(); + file.read_to_string(&mut data)?; + Ok(data) +} + + +pub struct LineParser<'a, T: FromStr> { + it: std::str::Lines<'a>, + convert: fn(&str) -> Result::Err> +} + + +impl<'a, T: FromStr> Iterator for LineParser<'a, T> { + type Item = Result::Err>; + + fn next(&mut self) -> Option { + self.it.next().map(|s| + (self.convert)(s) + ) + } +} + + +// define a trait so that we can attach it to String +pub trait ParseLines { + fn parse_lines(&self) -> LineParser<'_, T>; +} + + +impl ParseLines for String { + fn parse_lines(&self) -> LineParser<'_, T> { + LineParser { + it: self.lines(), + convert: str::parse:: + } + } +} - let it = reader.lines().map(|line| - Ok(line?.parse::()?) - ); - Ok(it) -} \ No newline at end of file diff --git a/2021/src/main.rs b/2021/src/main.rs index e13a6fb..6a867a9 100644 --- a/2021/src/main.rs +++ b/2021/src/main.rs @@ -1,7 +1,7 @@ use color_eyre::eyre; mod lib; -use lib::iter_nums; +use lib::{load, ParseLines}; @@ -11,10 +11,12 @@ fn main() -> eyre::Result<()> { fn day_one() -> eyre::Result<()> { + let data = load("data/01.txt")?; + let mut single_increases = 0; let mut window_increases = 0; let mut prev = (None, None, None); - for res in iter_nums("data/01.txt")? { + for res in data.parse_lines::() { let n = res?; if let Some(p) = prev.2 { // apparently we can't combine "if let" and regular boolean conditions @@ -36,3 +38,8 @@ fn day_one() -> eyre::Result<()> { println!("Two: {}", window_increases); Ok(()) } + + +// fn day_two() -> eyre::Result<()> { + +// }