sort method

  1. @override
void sort([
  1. int compare(
    1. E? a,
    2. E? b
    )?
])
override

Default comparison would deem null element as largest, i.e. null would be at the end of this List. If you want to change this default behaviour, must provide a new compare function.

Implementation

@override
void sort([int Function(E? a, E? b)? compare]) {
  _checkUnmodifiable();

  _compactElements();
  final len = length; // purge GCed
  if (len == 0 || _segList.isEmpty) return; // nothing to do

  final compare0 = compare ?? _largeNullCompare;
  final smallNull = _segList.isNotEmpty &&
      compare0(null, _segList.first._elements.first.target) < 0;
  final result = _Seg<E>(0);
  for (final seg in _segList) {
    result.mergeSeg(seg);
  }
  int compare1(WeakReference<E> a, WeakReference<E> b) =>
      compare0(a.target, b.target);
  result._elements.sort(compare1);
  if (smallNull) {
    result.start = len - result.length;
  }
  _segList = <_Seg<E>>[result];
  for (final weakRef in result._elements) {
    _finalizer.attach(weakRef, _Token());
  }
}