Skip to content

paginate operator #30

Closed
Closed
@sergdort

Description

@sergdort

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?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions