orderList<T> function

void orderList<T>(
  1. List<T> collection,
  2. T item,
  3. num getCompareValue(
    1. T
    )
)

Implementation

void orderList<T>(List<T> collection, T item, num Function(T) getCompareValue) {
  if (collection.isEmpty) {
    collection.add(item);
    return;
  }

  final itemValue = getCompareValue(item);

  if (getCompareValue(collection.last) > itemValue) {
    collection.add(item);
    return;
  }

  if (itemValue >= getCompareValue(collection.first)) {
    collection.insert(0, item);
    return;
  }

  Tuple2<int, int> insertRange = Tuple2(0, collection.length - 1);
  while (insertRange.item2 - insertRange.item1 > 3) {
    final middleIndex = ((insertRange.item1 + insertRange.item2) / 2).floor();
    if (getCompareValue(collection[middleIndex]) > itemValue) {
      insertRange = insertRange.withItem1(middleIndex);
    } else {
      insertRange = insertRange.withItem2(middleIndex);
    }
  }

  for (int i = insertRange.item2; i >= insertRange.item1; --i) {
    if (getCompareValue(collection[i]) > itemValue) {
      collection.insert(i + 1, item);
      return;
    }
  }

  collection.insert(insertRange.item1, item);
}