aboutsummaryrefslogtreecommitdiff
path: root/discord
diff options
context:
space:
mode:
authorJosh <[email protected]>2020-12-04 09:32:53 +1000
committerGitHub <[email protected]>2020-12-03 18:32:53 -0500
commitf8e428bd5b01fb86032d727a7e8b10e3048b5fcf (patch)
tree0364361f37d876bd0325b86e18fc1368c94ced58 /discord
parentUpdate documentation for rules/updates channels (diff)
downloaddiscord.py-f8e428bd5b01fb86032d727a7e8b10e3048b5fcf.tar.xz
discord.py-f8e428bd5b01fb86032d727a7e8b10e3048b5fcf.zip
Add support for chunking AsyncIterator objects
Diffstat (limited to 'discord')
-rw-r--r--discord/iterators.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/discord/iterators.py b/discord/iterators.py
index 34dcd412..51431651 100644
--- a/discord/iterators.py
+++ b/discord/iterators.py
@@ -62,6 +62,11 @@ class _AsyncIterator:
if ret:
return elem
+ def chunk(self, max_size):
+ if max_size <= 0:
+ raise ValueError('async iterator chunk sizes must be greater than 0.')
+ return _ChunkedAsyncIterator(self, max_size)
+
def map(self, func):
return _MappedAsyncIterator(self, func)
@@ -92,6 +97,26 @@ class _AsyncIterator:
def _identity(x):
return x
+class _ChunkedAsyncIterator(_AsyncIterator):
+ def __init__(self, iterator, max_size):
+ self.iterator = iterator
+ self.max_size = max_size
+
+ async def next(self):
+ ret = []
+ n = 0
+ while n < self.max_size:
+ try:
+ item = await self.iterator.next()
+ except NoMoreItems:
+ if ret:
+ return ret
+ raise
+ else:
+ ret.append(item)
+ n += 1
+ return ret
+
class _MappedAsyncIterator(_AsyncIterator):
def __init__(self, iterator, func):
self.iterator = iterator