export interface PaginationState { visible: number; } export interface PaginationResult { items: T[]; hasMore: boolean; remaining: number; } export function createPaginator(pageSize: number) { return { slice(all: T[], visible: number): PaginationResult { return { items: all.slice(0, visible), hasMore: all.length > visible, remaining: Math.max(0, all.length - visible), }; }, nextVisible(current: number): number { return current + pageSize; }, reset(): number { return pageSize; }, }; }