From 123c62f81020ab5064cfbe55c27c418dfdebb7c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Christian=20Gr=C3=BCnhage?= Date: Mon, 13 Dec 2021 05:58:20 +0100 Subject: [PATCH] refactor parse_n to not require borrowing closures --- src/day_05/parsing.rs | 4 ++-- src/day_11/parsing.rs | 4 ++-- src/day_12/parsing.rs | 2 +- src/parsing.rs | 18 ++++++++++++------ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/day_05/parsing.rs b/src/day_05/parsing.rs index 0b9379d..b7336a0 100644 --- a/src/day_05/parsing.rs +++ b/src/day_05/parsing.rs @@ -3,14 +3,14 @@ use crate::parsing::{newline, parse_n, parse_number}; use yap::Tokens; pub fn parse_point(tokens: &mut impl Tokens) -> Option { - parse_n(tokens, &|t| parse_number(t), &|t| t.token(',')).map(|point: [usize; 2]| Point { + parse_n(tokens, |t| parse_number(t), |t| t.token(',')).map(|point: [usize; 2]| Point { x: point[0], y: point[1], }) } pub fn parse_line(tokens: &mut impl Tokens) -> Option { - parse_n(tokens, &|t| parse_point(t), &|t| t.tokens(" -> ".chars())).map(|points: [Point; 2]| { + parse_n(tokens, |t| parse_point(t), |t| t.tokens(" -> ".chars())).map(|points: [Point; 2]| { Line { start: points[0], end: points[1], diff --git a/src/day_11/parsing.rs b/src/day_11/parsing.rs index 74e4f8a..f698b23 100644 --- a/src/day_11/parsing.rs +++ b/src/day_11/parsing.rs @@ -7,8 +7,8 @@ use super::OctopusGrid; pub fn parse_octopus_grid(tokens: &mut impl Tokens) -> Option { parse_n( tokens, - &|t| parse_n(t, &|t| parse_digit(t), &|_| true), - &|t| newline(t), + |t| parse_n(t, |t| parse_digit(t), |_| true), + |t| newline(t), ) .map(|grid| OctopusGrid { grid }) } diff --git a/src/day_12/parsing.rs b/src/day_12/parsing.rs index 18acf78..678c69a 100644 --- a/src/day_12/parsing.rs +++ b/src/day_12/parsing.rs @@ -10,7 +10,7 @@ pub fn parse_cave_system(tokens: &mut impl Tokens) -> Option) -> Option<[Cave; 2]> { - parse_n(tokens, &|t| parse_cave(t), &|t| t.token('-')) + parse_n(tokens, |t| parse_cave(t), |t| t.token('-')) } pub fn parse_cave(tokens: &mut impl Tokens) -> Option { diff --git a/src/parsing.rs b/src/parsing.rs index 6b2a6f3..0273a46 100644 --- a/src/parsing.rs +++ b/src/parsing.rs @@ -35,14 +35,20 @@ pub fn parse_number_with_radix( .flatten() } -pub fn parse_n, const N: usize>( - tokens: &mut P, - parser: &dyn Fn(&mut P) -> Option, - separator: &dyn Fn(&mut P) -> bool, -) -> Option<[T; N]> { +pub fn parse_n( + tokens: &mut T, + parser: P, + separator: S, +) -> Option<[R; N]> +where + R: Debug, + T: Tokens, + P: FnMut(&mut T) -> Option, + S: FnMut(&mut T) -> bool, +{ tokens .sep_by(parser, separator) - .collect::>() + .collect::>() .try_into() .ok() }