38 lines
828 B
Rust
38 lines
828 B
Rust
|
use yap::Tokens;
|
||
|
|
||
|
use crate::parsing::{newline, parse_digit};
|
||
|
|
||
|
use super::HeightMap;
|
||
|
|
||
|
pub fn parse_map(tokens: &mut impl Tokens<Item = char>) -> HeightMap {
|
||
|
let map: Vec<Vec<usize>> = tokens.sep_by(|t| parse_line(t), |t| newline(t)).collect();
|
||
|
HeightMap::new(map)
|
||
|
}
|
||
|
|
||
|
pub fn parse_line(tokens: &mut impl Tokens<Item = char>) -> Option<Vec<usize>> {
|
||
|
let digits: Vec<usize> = tokens.many(|t| parse_digit(t)).collect();
|
||
|
if digits.is_empty() {
|
||
|
None
|
||
|
} else {
|
||
|
Some(digits)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[cfg(test)]
|
||
|
mod test {
|
||
|
use yap::IntoTokens;
|
||
|
|
||
|
#[test]
|
||
|
fn parse_line() {
|
||
|
assert_eq!(
|
||
|
dbg!(super::parse_line(&mut "2199943210".into_tokens()).unwrap()).len(),
|
||
|
10
|
||
|
)
|
||
|
}
|
||
|
|
||
|
#[test]
|
||
|
fn parse_map() {
|
||
|
super::parse_map(&mut "01\n11".into_tokens());
|
||
|
}
|
||
|
}
|