class _AsyncTrigger:
    def __init__(self, cmd):
        self.cmd = cmd

    def __await__(self):
        yield self.cmd
    
    async def until(self, condition):
        while not (await condition.get()):
            await self


class SimulatorContext:
    def delay(self, interval=None):
        return _AsyncTrigger(Delay(interval))

    def tick(self, domain="sync"):
        return _AsyncTrigger(Tick(domain))

    def changed(self, signal, value=None):
        return _AsyncTrigger(_Changed(signal, value))