merge method
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;
}