Browse Source

... and shared module

main
Julio Biason 1 year ago
parent
commit
d97da2b726
  1. 39
      day1/src/elven_calories.rs
  2. 39
      day1/src/step1.rs
  3. 40
      day1/src/step2.rs

39
day1/src/elven_calories.rs

@ -0,0 +1,39 @@
//! Extends the BufReader Lines to support summing based on newlines.
use std::io::BufRead;
use std::io::Lines;
pub struct Accumulator<B> {
lines: Lines<B>,
current: u32,
}
pub trait Elvish<B> {
fn elf(self) -> Accumulator<B>;
}
impl<B> Elvish<B> for Lines<B> {
fn elf(self) -> Accumulator<B> {
Accumulator {
lines: self,
current: 0,
}
}
}
impl<B: BufRead> Iterator for Accumulator<B> {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
while let Some(Ok(line)) = self.lines.next() {
let line = line.trim();
if line.is_empty() {
let result = self.current;
self.current = 0;
return Some(result);
} else {
self.current += line.parse::<u32>().unwrap();
}
}
None
}
}

39
day1/src/step1.rs

@ -1,46 +1,13 @@
mod elven_calories;
use std::fs::File;
use std::io::BufRead;
use std::io::BufReader;
use std::io::Lines;
use clap::Arg;
use clap::Command;
struct Accumulator<B> {
lines: Lines<B>,
current: u32,
}
trait Elvish<B> {
fn elf(self) -> Accumulator<B>;
}
impl<B> Elvish<B> for Lines<B> {
fn elf(self) -> Accumulator<B> {
Accumulator {
lines: self,
current: 0,
}
}
}
impl<B: BufRead> Iterator for Accumulator<B> {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
while let Some(Ok(line)) = self.lines.next() {
let line = line.trim();
if line.is_empty() {
let result = self.current;
self.current = 0;
return Some(result);
} else {
self.current += line.parse::<u32>().unwrap();
}
}
None
}
}
use elven_calories::Elvish;
fn main() {
let matches = Command::new("Day1").arg(Arg::new("filename")).get_matches();

40
day1/src/step2.rs

@ -1,48 +1,14 @@
mod elven_calories;
use std::fs::File;
use std::io::BufRead;
use std::io::BufReader;
use std::io::Lines;
use clap::Arg;
use clap::Command;
use itertools::Itertools;
struct Accumulator<B> {
lines: Lines<B>,
current: u32,
}
trait Elvish<B> {
fn elf(self) -> Accumulator<B>;
}
impl<B> Elvish<B> for Lines<B> {
fn elf(self) -> Accumulator<B> {
Accumulator {
lines: self,
current: 0,
}
}
}
impl<B: BufRead> Iterator for Accumulator<B> {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
while let Some(Ok(line)) = self.lines.next() {
let line = line.trim();
if line.is_empty() {
let result = self.current;
self.current = 0;
return Some(result);
} else {
self.current += line.parse::<u32>().unwrap();
}
}
None
}
}
use elven_calories::Elvish;
fn main() {
let matches = Command::new("Day1").arg(Arg::new("filename")).get_matches();

Loading…
Cancel
Save