fromItems<T, G> static method

List<VoGroup<T, G>> fromItems<T, G>(
  1. List<T> items,
  2. G groupBy(
    1. T item
    ), {
  3. Comparator<G>? groupComparator,
  4. Comparator<T>? itemComparator,
})

Splits items into groups by groupBy.

Groups keep the order their first item appears in items unless groupComparator is set; items keep their order within a group unless itemComparator is set.

Implementation

static List<VoGroup<T, G>> fromItems<T, G>(
  List<T> items,
  G Function(T item) groupBy, {
  Comparator<G>? groupComparator,
  Comparator<T>? itemComparator,
}) {
  final grouped = <G, List<T>>{};
  for (final item in items) {
    grouped.putIfAbsent(groupBy(item), () => <T>[]).add(item);
  }

  final keys = grouped.keys.toList();
  if (groupComparator != null) keys.sort(groupComparator);

  return [
    for (final key in keys)
      VoGroup(
        key,
        itemComparator == null
            ? grouped[key]!
            : (grouped[key]!..sort(itemComparator)),
      ),
  ];
}