| f | import asyncio | f | import asyncio |
| | | |
| class Loop: | | class Loop: |
| n | funcs = [] | n | _funcs = [] |
| wrappers = [] | | _steps = [] |
| ready = None | | _evt = None |
| started = False | | _launched = False |
| stop = False | | _halt = False |
| total = 0 | | _count = 0 |
| | | |
| n | def __call__(self, func): | n | def __call__(self, fn): |
| Loop.funcs.append(func) | | Loop._funcs.append(fn) |
| Loop.total = len(Loop.funcs) | | Loop._count = len(Loop._funcs) |
| | | |
| n | async def wrapper(*args, **kwargs): | n | async def outer(*a, **kw): |
| if Loop.ready is None: | | if Loop._evt is None: |
| Loop.ready = asyncio.Event() | | Loop._evt = asyncio.Event() |
| | | |
| n | async def step(): | n | async def runner(): |
| while True: | | while True: |
| n | if Loop.stop: | n | if Loop._halt: |
| return None | | return None |
| n | r = await func(*args, **kwargs) | n | out = await fn(*a, **kw) |
| if r is None: | | if out is None: |
| Loop.stop = True | | Loop._halt = True |
| return None | | return None |
| n | return r | n | return out |
| Loop.wrappers.append(step) | | Loop._steps.append(runner) |
| if len(Loop.wrappers) == Loop.total: | | if len(Loop._steps) == Loop._count: |
| Loop.ready.set() | | Loop._evt.set() |
| await Loop.ready.wait() | | await Loop._evt.wait() |
| if not Loop.started: | | if not Loop._launched: |
| Loop.started = True | | Loop._launched = True |
| await Loop._run() | | await Loop._cycle() |
| return None | | return None |
| n | return wrapper | n | return outer |
| | | |
| @staticmethod | | @staticmethod |
| n | async def _run(): | n | async def _cycle(): |
| steps = Loop.wrappers | | seq = Loop._steps |
| while True: | | while True: |
| t | for s in steps: | t | for r in seq: |
| r = await s() | | val = await r() |
| if r is None: | | if val is None: |
| return | | return |