import { Signal } from '@angular/core'; import { Observable } from 'rxjs'; /** * Estrategia de paginacion. */ export type PaginationStrategy = 'offset' | 'cursor' | 'page'; /** * Estado de paginacion. */ export interface PaginationState { /** Items actuales */ items: T[]; /** Pagina actual (para estrategia offset/page) */ page: number; /** Tamano de pagina */ pageSize: number; /** Conteo total (si se conoce) */ total?: number; /** Cursor para siguiente pagina (para estrategia cursor) */ nextCursor?: unknown; /** Cursor para pagina anterior */ prevCursor?: unknown; /** Si existen mas items */ hasMore: boolean; /** Estado de carga */ isLoading: boolean; /** Estado de error */ error?: Error; } /** * Parametros para funcion de carga. */ export interface PaginationLoadParams { /** Estrategia de paginacion */ strategy: PaginationStrategy; /** Numero de pagina */ page: number; /** Tamano de pagina */ pageSize: number; /** Cursor (para estrategia cursor) */ cursor?: unknown; /** Direccion de carga */ direction: 'forward' | 'backward'; } /** * Resultado de funcion de carga. */ export interface PaginationLoadResult { /** Items cargados */ items: T[]; /** Si hay mas items */ hasMore: boolean; /** Total de items (opcional) */ total?: number; /** Cursor para siguiente pagina */ nextCursor?: unknown; /** Cursor para pagina anterior */ prevCursor?: unknown; } /** * Configuracion para crear un controlador de paginacion. */ export interface PaginationConfig { /** Estrategia de paginacion */ strategy: PaginationStrategy; /** Tamano de pagina */ pageSize?: number; /** Items iniciales (opcional) */ initialItems?: T[]; /** Funcion de carga */ loadFn: (params: PaginationLoadParams) => Observable> | Promise>; /** Funcion de tracking para items */ trackBy?: (item: T) => unknown; } /** * Interface del controlador de paginacion. */ export interface PaginationController { /** Estado reactivo como signal */ state: Signal>; /** Signal de items (accessor de conveniencia) */ items: Signal; /** Signal de carga */ isLoading: Signal; /** Signal de mas items */ hasMore: Signal; /** Signal de error */ error: Signal; /** Signal de pagina actual */ currentPage: Signal; /** Signal de total */ total: Signal; /** Cargar siguiente pagina */ loadNext(): Promise; /** Cargar pagina anterior (si soportado) */ loadPrevious(): Promise; /** Refresh (recargar desde inicio) */ refresh(): Promise; /** Reset a estado inicial */ reset(): void; /** Actualizar un item */ updateItem(predicate: (item: T) => boolean, updates: Partial): void; /** Remover un item */ removeItem(predicate: (item: T) => boolean): void; /** Agregar items al inicio */ prependItems(items: T[]): void; /** Agregar items al final */ appendItems(items: T[]): void; } /** * Estado inicial para controladores de paginacion. */ export declare function createInitialPaginationState(pageSize: number, initialItems?: T[]): PaginationState;