import run_tests def traffic_light() -> Obj: is_green = False timeout = 0 def dispatch( what: str, *args: Any ) -> Any: nonlocal is_green, timeout if what == 'is_green': return is_green if what == 'set_green': is_green = True if what == 'set_red': timeout = 5 if what == 'tick': if timeout > 0: timeout -= 1 if timeout == 0: is_green = False return dispatch def button( pedestrian_light: Obj, vehicle_light: Obj ) -> Obj: timeout = 0 to_green = True def dispatch( what: str, *args: Any ) -> Any: nonlocal to_green, timeout if what == 'push': vehicle_light( 'set_red' ) if what == 'tick': if not vehicle_light( 'is_green' ) and \ not pedestrian_light( 'is_green' ): if to_green: pedestrian_light( 'set_green' ) timeout = 20 else: vehicle_light( 'set_green' ) to_green = True if timeout > 0: timeout -= 1 if timeout == 0: pedestrian_light( 'set_red' ) to_green = False return dispatch