From a661a2febb6ecabd6b6f2b8ea131abab70498726 Mon Sep 17 00:00:00 2001 From: Noah Hellman Date: Mon, 23 Jan 2023 21:41:04 +0100 Subject: [PATCH] parser: parse AlphaLower/Upper numbers --- src/lib.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 187e211..3494cd9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -267,7 +267,26 @@ impl OrderedListNumbering { fn parse_number(self, n: &str) -> u32 { match self { Self::Decimal => n.parse().unwrap(), - Self::AlphaLower | Self::AlphaUpper => 1, + Self::AlphaLower | Self::AlphaUpper => { + let d0 = u32::from(if matches!(self, Self::AlphaLower) { + b'a' + } else { + b'A' + }); + let weights = (1..=n.len()).scan(1, |a, _| { + let prev = *a; + *a *= 26; + Some(prev) + }); + n.as_bytes() + .iter() + .rev() + .copied() + .map(u32::from) + .zip(weights) + .map(|(d, w)| w * (d - d0 + 1)) + .sum() + } Self::RomanLower => 1, Self::RomanUpper => 1, } @@ -1102,4 +1121,12 @@ mod test { }), ); } + + #[test] + fn numbering_alpha() { + assert_eq!(AlphaLower.parse_number("a"), 1); + assert_eq!(AlphaUpper.parse_number("B"), 2); + assert_eq!(AlphaUpper.parse_number("Z"), 26); + assert_eq!(AlphaLower.parse_number("aa"), 27); + } }