Skip to content

Commit

Permalink
Refactor RichProgressBar to support async iterator
Browse files Browse the repository at this point in the history
  • Loading branch information
glensc committed Apr 30, 2024
1 parent 9574d78 commit 824409b
Showing 1 changed file with 26 additions and 4 deletions.
30 changes: 26 additions & 4 deletions plextraktsync/rich/RichProgressBar.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,41 @@ def __init__(self, iterable, total=None, options=None, desc=""):
self.total = total
self.i = 0

if hasattr(iterable, "__next__"):
self.iterable_next = iterable.__next__
else:
self.iterable_next = iter(iterable).__next__
self.iterable_awaitable = False
if iterable is not None:
if hasattr(iterable, "__anext__"):
self.iterable_next = iterable.__anext__
self.iterable_awaitable = True
elif hasattr(iterable, "__next__"):
self.iterable_next = iterable.__next__
else:
self.iterable_next = iter(iterable).__next__

def __iter__(self):
if self.iterable_awaitable:
raise RuntimeError("Iterable must be awaited")

return self

def __aiter__(self):
return self

def __next__(self):
res = self.iterable_next()
self.update()
return res

async def __anext__(self):
try:
if self.iterable_awaitable:
res = await self.iterable_next()
else:
res = self.iterable_next()
self.update()
return res
except StopIteration:
raise StopAsyncIteration

def __enter__(self):
self.progress.__enter__()
return self
Expand Down

0 comments on commit 824409b

Please sign in to comment.