Map<T, List<E>> groupBy<S, T>(T Function(E) key) { var map = <T, List<E>>{}; for (var element in this) { (map[key(element)] ??= []).add(element); } return map; }