|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Map<S, List<T>> groupBy<S, T>(Iterable<T> values, S Function(T) key) {
|
|
|
|
var map = <S, List<T>>{};
|
|
|
|
for (var element in values) {
|
|
|
|
(map[key(element)] ??= []).add(element);
|
|
|
|
}
|
|
|
|
return map;
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, int> groupCount<S, T>(Map<S, List<T>> values) {
|
|
|
|
var map = <String, int>{};
|
|
|
|
for (var element in values.keys) {
|
|
|
|
map["$element"] = values[element]?.length ?? 0;
|
|
|
|
}
|
|
|
|
return map;
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, T> groupItem<S, T>(Map<S, List<T>> values, {int Function(T) key}) {
|
|
|
|
var map = <String, T>{};
|
|
|
|
for (var element in values.keys) {
|
|
|
|
if (values[element] == null) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
map["$element"] = key == null ? values[element].first : values[element].lMax(key);
|
|
|
|
}
|
|
|
|
return map;
|
|
|
|
}
|
|
|
|
|
|
|
|
T max<T>(Iterable<T> list, int Function(T) key) {
|
|
|
|
T tt;
|
|
|
|
for (T t in list) {
|
|
|
|
if (tt == null) {
|
|
|
|
tt = t;
|
|
|
|
}
|
|
|
|
if (key(tt) < key(t)) {
|
|
|
|
tt = t;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tt;
|
|
|
|
}
|
|
|
|
|
|
|
|
extension ListExtension<S, T> on Iterable<T> {
|
|
|
|
|
|
|
|
Map<S, List<T>> lGroupBy(S Function(T) key) {
|
|
|
|
return groupBy(this, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
T lMax(int Function(T) key) {
|
|
|
|
return max(this, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
extension MapExtension<S, T> on Map<S, List<T>> {
|
|
|
|
|
|
|
|
Map<String, int> get mGroupCount => groupCount(this);
|
|
|
|
|
|
|
|
Map<String, T> mGroupItem({int Function(T) key}) {
|
|
|
|
return groupItem(this, key: key);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|