export interface PaginationOptions { take: number; skip?: number; } export interface PaginationResult { items: T[]; hasNextPage: boolean; } export type Paginated = Promise>; export async function* usePagination( pageSize: number, getNextPage: (pagination: PaginationOptions) => PaginationResult | Paginated, ) { let hasNextPage = true; for (let skip = 0; hasNextPage; skip += pageSize) { const result = await getNextPage({ take: pageSize, skip }); hasNextPage = result.hasNextPage; yield result.items; } } export function paginationHelper(items: Entity[], take: number): PaginationResult { const hasNextPage = items.length > take; items.splice(take); return { items, hasNextPage }; }