Skip to content

Commit 48e2a8c

Browse files
committed
improve type annotation
1 parent 362a7bb commit 48e2a8c

File tree

3 files changed

+50
-23
lines changed

3 files changed

+50
-23
lines changed

python/hangman_solver/__init__.pyi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from collections.abc import Collection, Mapping
1+
from collections.abc import Collection, Sequence, Mapping
22
from typing import Final, Never
33

44

@@ -17,15 +17,15 @@ def read_words_with_length(language: Language, word_length: int, /) -> Collectio
1717

1818
def solve(
1919
pattern_string: str,
20-
invalid_letters: str,
20+
invalid_letters: Sequence[str],
2121
language: Language,
2222
max_words_to_collect: int
2323
) -> HangmanResult:
2424
pass
2525

2626
def solve_crossword(
2727
pattern_string: str,
28-
invalid_letters: str,
28+
invalid_letters: Sequence[str],
2929
language: Language,
3030
max_words_to_collect: int
3131
) -> HangmanResult:

src/lib.rs

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,39 @@ pub use crate::language::UnknownLanguageError;
3131
#[cfg(feature = "pyo3")]
3232
use pyo3::prelude::*;
3333

34+
#[cfg(feature = "pyo3")]
35+
#[derive(FromPyObject)]
36+
pub enum InvalidLetters<'py> {
37+
String(Bound<'py, PyString>),
38+
Chars(Vec<char>),
39+
}
40+
3441
#[cfg(feature = "pyo3")]
3542
#[pyfunction]
3643
#[pyo3(signature = (pattern_string, invalid_letters, language, max_words_to_collect))]
3744
#[allow(clippy::needless_pass_by_value)]
3845
pub fn solve(
3946
pattern_string: Bound<'_, PyString>,
40-
invalid_letters: Bound<'_, PyString>,
47+
invalid_letters: InvalidLetters<'_>,
4148
language: Language,
4249
max_words_to_collect: usize,
4350
) -> PyResult<HangmanResult> {
44-
crate::solver::solve(
45-
&pattern_string,
46-
&invalid_letters,
47-
true,
48-
language,
49-
Some(max_words_to_collect),
50-
)
51+
match invalid_letters {
52+
InvalidLetters::String(invalid_letters) => crate::solver::solve(
53+
&pattern_string,
54+
&invalid_letters,
55+
true,
56+
language,
57+
Some(max_words_to_collect),
58+
),
59+
InvalidLetters::Chars(invalid_letters) => crate::solver::solve(
60+
&pattern_string,
61+
&invalid_letters,
62+
true,
63+
language,
64+
Some(max_words_to_collect),
65+
),
66+
}
5167
}
5268

5369
#[cfg(feature = "pyo3")]
@@ -56,17 +72,26 @@ pub fn solve(
5672
#[allow(clippy::needless_pass_by_value)]
5773
pub fn solve_crossword(
5874
pattern_string: Bound<'_, PyString>,
59-
invalid_letters: Bound<'_, PyString>,
75+
invalid_letters: InvalidLetters<'_>,
6076
language: Language,
6177
max_words_to_collect: usize,
6278
) -> PyResult<HangmanResult> {
63-
crate::solver::solve(
64-
&pattern_string,
65-
&invalid_letters,
66-
false,
67-
language,
68-
Some(max_words_to_collect),
69-
)
79+
match invalid_letters {
80+
InvalidLetters::String(invalid_letters) => crate::solver::solve(
81+
&pattern_string,
82+
&invalid_letters,
83+
false,
84+
language,
85+
Some(max_words_to_collect),
86+
),
87+
InvalidLetters::Chars(invalid_letters) => crate::solver::solve(
88+
&pattern_string,
89+
&invalid_letters,
90+
false,
91+
language,
92+
Some(max_words_to_collect),
93+
),
94+
}
7095
}
7196

7297
#[must_use]

src/solver/pattern.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,21 @@ impl Pattern {
6767
pattern_as_chars.extend(ch.to_lowercase());
6868
}
6969

70-
7170
let mut invalid_letters_vec: Vec<char> = invalid_letters
7271
.try_iter_chars()?
73-
.filter(|ch| !ch.as_ref().is_ok_and(|ch| ch.is_whitespace() || ch.is_wildcard()))
72+
.filter(|ch| {
73+
!ch.as_ref()
74+
.is_ok_and(|ch| ch.is_whitespace() || ch.is_wildcard())
75+
})
7476
.collect::<Result<_, _>>()?;
7577

7678
if letters_in_pattern_have_no_other_occurrences {
7779
for ch in &pattern_as_chars {
7880
if ch.is_normalised_wildcard() {
79-
continue
81+
continue;
8082
}
8183
if invalid_letters_vec.contains(ch) {
82-
continue
84+
continue;
8385
}
8486
invalid_letters_vec.push(*ch);
8587
}

0 commit comments

Comments
 (0)