groupBy<TObj, TKey> function

List<GroupByX<TObj, TKey>> groupBy<TObj, TKey>(
  1. Iterable<TObj> seq, {
  2. dynamic by(
    1. TObj x
    )? = null,
  3. Comparator? matchWith = null,
  4. dynamic valuesAs(
    1. dynamic x
    )? = null,
})

Implementation

List<GroupByX<TObj, TKey>> groupBy<TObj, TKey>(Iterable<TObj> seq,
    {by(TObj x)?: null, Comparator? matchWith: null, valuesAs(x)?: null}) {
  var map = new Map<TKey?, GroupByX<TObj, TKey>>();
  seq.forEach((x) {
    var val = by!(x);
    var key = matchWith != null
        ? map.keys.firstWhere((k) => matchWith(val, k) == 0, orElse: () => val)
        : val;

    if (!map.containsKey(key)) map[key] = new GroupByX<TObj, TKey>(val);

    if (valuesAs != null) x = valuesAs(x);

    map[key]!.add(x);
  });
  return map.values.toList();
}