Compare commits

...

2 commits

Author SHA1 Message Date
Jan Christian Grünhage 7e377d3f92 simplify number parsing 2021-12-12 14:31:30 +01:00
Jan Christian Grünhage 933ed7a5b8 simplify day 5 parsing 2021-12-12 14:30:08 +01:00
2 changed files with 13 additions and 29 deletions

View file

@ -1,33 +1,19 @@
use super::model::{Line, Point}; use super::model::{Line, Point};
use crate::parsing::{newline, parse_number}; use crate::parsing::{newline, parse_n, parse_number};
use yap::{IntoTokens, Tokens}; use yap::Tokens;
pub fn parse_point(tokens: &mut impl Tokens<Item = char>) -> Option<Point> { pub fn parse_point(tokens: &mut impl Tokens<Item = char>) -> Option<Point> {
let numbers: Vec<usize> = tokens parse_n(tokens, &|t| parse_number(t), &|t| t.token(',')).map(|point: [usize; 2]| Point {
.sep_by(|t| parse_number(t), |t| t.token(',')) x: point[0],
.collect(); y: point[1],
if numbers.len() == 2 { })
Some(Point {
x: numbers[0],
y: numbers[1],
})
} else {
None
}
} }
pub fn parse_line(tokens: &mut impl Tokens<Item = char>) -> Option<Line> { pub fn parse_line(tokens: &mut impl Tokens<Item = char>) -> Option<Line> {
let points: Vec<Point> = tokens parse_n(tokens, &|t| parse_point(t), &|t| t.token(',')).map(|points: [Point; 2]| Line {
.sep_by(|t| parse_point(t), |t| t.tokens(" -> ".into_tokens())) start: points[0],
.collect(); end: points[1],
if points.len() == 2 { })
Some(Line {
start: points[0],
end: points[1],
})
} else {
None
}
} }
pub fn parse_lines(tokens: &mut impl Tokens<Item = char>) -> Vec<Line> { pub fn parse_lines(tokens: &mut impl Tokens<Item = char>) -> Vec<Line> {

View file

@ -30,11 +30,9 @@ pub fn parse_number_with_radix<T: Num>(
c.is_digit(base) && remaining >= 0 c.is_digit(base) && remaining >= 0
}) })
.collect(); .collect();
if !digits.is_empty() { (!digits.is_empty())
T::from_str_radix(&digits, base).ok() .then(|| T::from_str_radix(&digits, base).ok())
} else { .flatten()
None
}
} }
pub fn parse_n<T: Debug, P: Tokens<Item = char>, const N: usize>( pub fn parse_n<T: Debug, P: Tokens<Item = char>, const N: usize>(