from typing import Generator class SequenceValidator: def __init__(self) -> None: self._generator = self.check() self._consumed = -1 next(self._generator) def feed(self, text: str) -> tuple[int, bool | None]: try: for character in text: self._consumed += 1 self._generator.send(character) except StopIteration as stop_iteration: return (self._consumed, stop_iteration.value) else: return (self._consumed, None) def check(self) -> Generator[None, str, bool | None]: return False yield class BracesNumber(SequenceValidator): """A [ followed by 0 or more digits followed by ]""" def check(self) -> Generator[None, str, bool | None]: if (yield) != "[": return False while (character := (yield)) in "0123456789": pass return character == "]" data = "[123]" validator = BracesNumber() for character in data: print(validator.feed(character)) print("---") data = "[123)" validator = BracesNumber() for character in data: print(validator.feed(character))