from itertools import repeat
import trio
import tractor

tractor.log.get_console_log("INFO")


async def stream_forever():
    for i in repeat("I can see these little future bubble things"):
        # each yielded value is sent over the ``Channel`` to the
        # parent actor
        yield i
        await trio.sleep(0.01)


async def main():

    # stream for at most 1 seconds
    with trio.move_on_after(1) as cancel_scope:

        async with tractor.open_nursery() as n:

            portal = await n.start_actor(
                'donny',
                enable_modules=[__name__],
            )

            # this async for loop streams values from the above
            # async generator running in a separate process
            async with portal.open_stream_from(stream_forever) as stream:
                async for letter in stream:
                    print(letter)

    # we support trio's cancellation system
    assert cancel_scope.cancelled_caught
    assert n.cancelled


if __name__ == '__main__':
    trio.run(main)