from typing import Callable, Iterator


class CommandExecutor[R]:
    def __init__(self):
        self.__commands: dict[str, Callable[..., R]] = {}
    
    def run(self, name: str, *args, **kwargs) -> list[R]:
        results : list[R] = []
        for command_name, command in self.__commands.items():
            if command_name == name:
                results += [command(*args, **kwargs)]
        return results
    
    def register(self, cmd: Callable[..., R]) -> Callable[..., R]:
        self.__commands[cmd.__name__] = cmd
        return cmd
    
    
if __name__ == '__main__':
    app = CommandExecutor[str]()
    
    @app.register
    def hello_world() -> str:
        return 'hello_world'
   
    @app.register 
    def divide(a: int, b: int) -> str:
        if b == 0:
            return "tried to divide by zero"
        return str(a / b)
    
    print(app.run('hello_world'))
    print(app.run('divide', 5, 0))
    print(app.run('divide', 10, 2))
    