Compare commits
2 commits
d73485111d
...
7e377d3f92
Author | SHA1 | Date | |
---|---|---|---|
7e377d3f92 | |||
933ed7a5b8 |
|
@ -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> {
|
||||||
|
|
|
@ -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>(
|
||||||
|
|
Loading…
Reference in a new issue