From 211368ee456699d387ec5fae241b85fbf7e883c9 Mon Sep 17 00:00:00 2001 From: mehbark Date: Tue, 7 Jul 2026 18:52:35 -0400 Subject: [PATCH] add LetterSet::{to,from}_index --- src/letterset.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/letterset.rs b/src/letterset.rs index bf9838c..6514499 100644 --- a/src/letterset.rs +++ b/src/letterset.rs @@ -64,6 +64,17 @@ impl LetterSet { self.0 == 0 } + pub const fn to_index(self) -> usize { + self.0 as usize + } + + pub fn from_index(index: usize) -> Option { + u32::try_from(index) + .ok() + .filter(|n| *n <= Self::FULL.0) + .map(Self) + } + const fn letter_index(letter: u8) -> Option { if letter.is_ascii_alphabetic() { let lower = letter.to_ascii_lowercase(); @@ -203,4 +214,25 @@ mod test { assert!(!AB.is_empty()); assert!(!BC.is_empty()); } + + #[test] + fn to_index() { + assert_eq!(LetterSet::EMPTY.to_index(), 0); + assert_eq!(A.to_index(), 1); + assert_eq!(B.to_index(), 2); + assert_eq!(AB.to_index(), 3); + assert_eq!(C.to_index(), 4); + assert_eq!(AC.to_index(), 5); + assert_eq!(BC.to_index(), 6); + assert_eq!(ABC.to_index(), 7); + assert_eq!(LetterSet::FULL.to_index(), (1 << 26) - 1); + } + + #[test] + fn from_index() { + for ls in [LetterSet::EMPTY, A, B, C, AB, AC, BC, ABC, LetterSet::EMPTY] { + assert_eq!(LetterSet::from_index(ls.to_index()), Some(ls)); + } + assert_eq!(LetterSet::from_index(1 << 26), None); + } }