nc-photos/lib/iterable_extension.dart

61 lines
1.7 KiB
Dart
Raw Normal View History

2021-07-08 20:35:32 +02:00
import 'package:flutter/foundation.dart';
2021-04-26 12:54:57 +02:00
import 'package:tuple/tuple.dart';
2021-04-10 06:28:12 +02:00
extension IterableExtension<T> on Iterable<T> {
/// Return a new sorted list
2021-09-15 08:58:06 +02:00
List<T> sorted([int Function(T a, T b)? compare]) => toList()..sort(compare);
2021-04-10 06:28:12 +02:00
2021-07-08 20:35:32 +02:00
/// Return a new stable sorted list
2021-09-15 08:58:06 +02:00
List<T> stableSorted([int Function(T a, T b)? compare]) {
final tmp = toList();
2021-07-08 20:35:32 +02:00
mergeSort(tmp, compare: compare);
return tmp;
}
2021-04-10 06:28:12 +02:00
/// Return a string representation of this iterable by joining the result of
/// toString for each items
String toReadableString() => "[${join(', ')}]";
2021-09-15 08:58:06 +02:00
Iterable<U> mapWithIndex<U>(U Function(int index, T element) fn) sync* {
2021-04-10 06:28:12 +02:00
int i = 0;
for (final e in this) {
yield fn(i++, e);
}
}
2021-04-26 12:54:57 +02:00
Iterable<Tuple2<int, T>> withIndex() => mapWithIndex((i, e) => Tuple2(i, e));
/// Whether the collection contains an element equal to [element] using the
/// equality function [equalFn]
bool containsIf(T element, bool Function(T a, T b) equalFn) =>
any((e) => equalFn(e, element));
/// Same as [contains] but uses [identical] to compare the objects
bool containsIdentical(T element) =>
containsIf(element, (a, b) => identical(a, b));
Iterable<Tuple2<U, List<T>>> groupBy<U>({required U Function(T e) key}) {
final map = fold<Map<U, List<T>>>(
{},
(previousValue, element) =>
previousValue..putIfAbsent(key(element), () => []).add(element));
return map.entries.map((e) => Tuple2(e.key, e.value));
}
2021-08-07 22:34:44 +02:00
T? get firstOrNull {
try {
return first;
} on StateError catch (_) {
return null;
}
}
T? get lastOrNull {
try {
return last;
} on StateError catch (_) {
return null;
}
}
2021-04-10 06:28:12 +02:00
}