class CoroutineBlock(Promise): """Similar to go-block in core.async. Internal use only!""" def __init__(self, gen): super(CoroutineBlock, self).__init__() self._gen = gen self._last_promise = Promise() self._last_promise.delivery(None) processable.append(self) @property def parked(self): """Returns `True` when block parked.""" return not self._last_promise.delivered def process(self): """Process promises returned by coroutine generator.""" if not self.parked: try: self._last_promise = self._gen.send(self._last_promise.value) except StopIteration as e: self.delivery(e.value) self._close() except AttributeError: self.delivery(self._gen) self._close() def _close(self): """Removes self from list of active coroutine blocks.""" processable.remove(self)
def __init__(self, gen): super(CoroutineBlock, self).__init__() self._gen = gen self._last_promise = Promise() self._last_promise.delivery(None) processable.append(self)
def test_cant_be_delivered_twice(self): prom = Promise() self.assertTrue(prom.delivery(12)) self.assertFalse(prom.delivery(52)) self.assertEqual(prom.value, 12)
def test_delivery(self): prom = Promise() self.assertTrue(prom.delivery(12)) self.assertTrue(prom.delivered) self.assertEqual(prom.value, 12)