merge method

  1. @override
PageCountDataList<T> merge(
  1. DataList<T> _inputDataList
)
override

Merge two DataList

_inputDataList DataList for merge with current instance

Implementation

@override
PageCountDataList<T> merge(DataList<T> _inputDataList) {
  final inputDataList = _inputDataList as PageCountDataList<T>;

  if (startPage != unspecifiedPage &&
      inputDataList.startPage != unspecifiedPage &&
      pageSize != inputDataList.pageSize) {
    throw ArgumentError('pageSize for merging DataList must be same');
  }

  final resultPagesData = SplayTreeMap<int, List<T>>()
    ..addAll(_split())
    ..addAll(inputDataList._split());

  final newData = <T>[];
  var lastPage = unspecifiedPage;
  var lastPageItemsSize = unspecifiedPageSize;

  resultPagesData.forEach((pageNumber, pageItems) {
    if (lastPage != unspecifiedPage &&
        (pageNumber - lastPage > 1 || lastPageItemsSize < pageSize)) {
      throw IncompatibleRangesException(
        'Merging DataLists has empty space '
        'between its ranges\noriginalList:$this\ninputList: $inputDataList',
      );
    }
    lastPage = pageNumber;
    lastPageItemsSize = pageItems.length;
    newData.addAll(pageItems);
  });

  data
    ..clear()
    ..addAll(newData);

  startPage = resultPagesData.entries.first.key;
  numPages = lastPage - startPage + 1;
  totalItemsCount =
      inputDataList.totalItemsCount == unspecifiedTotalItemsCount
          ? totalItemsCount
          : inputDataList.totalItemsCount;
  totalPagesCount =
      inputDataList.totalPagesCount == unspecifiedTotalPagesCount
          ? totalPagesCount
          : inputDataList.totalPagesCount;

  if (inputDataList.pageSize != unspecifiedPageSize) {
    pageSize = inputDataList.pageSize;
  }

  return this;
}