Closed
Description
Name and description
Paginate operator
- provides pagination behavior
Motivation for inclusion
It was highly inspired by this tricky behavior in the RxExample 👍
The use case is pretty common (from my perspective), so I want to introduce operator which will provide this behavior
Proposed implementation
extension ObservableType {
func paginate<O: ObservableType>(nextPageTrigger: O,
hasNextPage: E -> Bool,
nextPageFactory: E -> Observable<E>) -> Observable<E> {
return flatMap { page -> Observable<E> in
if !hasNextPage(page) {
return Observable.just(page)
}
return [
Observable.just(page),
Observable.never().takeUntil(nextPageTrigger),
nextPageFactory(page)
].concat()
}
}
}
Example of use
func paginateItems(batch: Batch = Batch.initial,
endPoint: EndPoint,
nextBatchTrigger: Observable<Void>) -> Observable<Page<[T]>> {
let params = paramsProvider.pagingListParamsForBatch(batch)
return httpClient
.request(.GET, endPoint,
parameters: paramsProvider.defaultParams + params,
encoding: .URL,
headers: nil)
.map(PagingParser<T>.parse)
.paginate(nextBatchTrigger,
hasNextPage: { (page) -> Bool in
return page.batch.next().hasNextPage
}) { [weak self] (page) -> Observable<Page<[T]>> in
return self?.paginateItems(page.batch.next(),
endPoint: endPoint,
nextBatchTrigger: nextBatchTrigger) ?? Observable.empty()
}
}
P.S.
Still not sure about naming and whether it's could be applied for all scenarios
Wondering what you guys think about its inclusion?