From edcd4b65a5bb9224689b7cfbeb471a4437ef3411 Mon Sep 17 00:00:00 2001 From: yupix Date: Thu, 14 Sep 2023 18:41:16 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20pagination=5Fiterator=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mipac/utils/pagination.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/mipac/utils/pagination.py b/mipac/utils/pagination.py index 692f0ff..b7375ab 100644 --- a/mipac/utils/pagination.py +++ b/mipac/utils/pagination.py @@ -1,8 +1,15 @@ -from typing import Any, Generic, Literal, TypeVar +from __future__ import annotations +from typing import TYPE_CHECKING, Any, AsyncGenerator, Generic, Literal, Type, TypeVar + +from mipac.abstract.model import AbstractModel from mipac.http import HTTPClient, Route +if TYPE_CHECKING: + from mipac.manager.client import ClientManager + T = TypeVar("T") +M = TypeVar("M", bound=AbstractModel) class Pagination(Generic[T]): @@ -64,3 +71,14 @@ class Pagination(Generic[T]): if self.pagination_type == "until" and self.latest_res_count == 0: return True return False + + +async def pagination_iterator( + pagination: Pagination, get_all: bool = False, *, model: Type[M], client: ClientManager +) -> AsyncGenerator[M, None]: + while True: + res = await pagination.next() + for i in res: + yield model(i, client=client) + if pagination.is_final or get_all is False: + break