class glitch_resistant_edge():
    def __init__(self, ctx, signal, polarity):
        self._ctx = ctx
        self._signal = signal
        self._sample = []
        self._debounce_time = 0.999e-8
        self._polarity = polarity

    async def await_me(self):
        while True:
            print(".")
            delay_expired, signal_value = await self._ctx.delay(self._debounce_time).changed(self._signal)
            if delay_expired and (signal_value == (self._polarity ^ 1)):
                break
        print("!!")
        values = await self._ctx.edge(self._signal, self._polarity).sample(*self._sample)
        while True:
            delay_expired, signal_value = await self._ctx.delay(self._debounce_time).changed(self._signal)
            if delay_expired and (signal_value == self._polarity):
                break
        return values

    def __await__(self):
        return self.await_me().__await__()

    def sample(self, *args):
        self._sample.extend(args)
        return self