from typing import TypedDict from snanosm.mealy import Machine, TransitionInputEnum class Context(TypedDict): count: int position: int matches: int def dinc(context: Context): context["count"] += 1 def dset(context: Context): context["position"] = context["count"] context["count"] += 1 def dprn(context: Context): context["count"] += 1 print(f"SUBSTRING FOUND AT POSITION: {context['position']}") context["matches"] += 1 # Detects the sequence AB in the string, printing the position and returning the amount of matches def detector(input_string: str) -> int: initial_context: Context = { "count": 0, "position": 0, "matches": 0, } m = Machine(initial_context) m.add_state("Q0", True, False) m.add_state("Q1", False, False) m.add_transition("A", "Q0", "Q1", lambda context: dset(context)) m.add_transition(TransitionInputEnum.MATCH_REST, "Q0", "Q0", lambda context: dinc(context)) m.add_transition("B", "Q1", "Q0", lambda context: dprn(context)) m.add_transition(TransitionInputEnum.MATCH_REST, "Q1", "Q0", lambda context: dinc(context)) for c in input_string: m.process_input(c) return initial_context["matches"] if __name__ == "__main__": print("== 1 ==") n = detector("AAAAAAABAAAAAB") print(f"Matches: {n}") print("== 2 ==") n = detector("AAAA") print(f"Matches: {n}") print("== 3 ==") n = detector("ABCCBBACAB") print(f"Matches: {n}")