nc-photos/lib/list_extension.dart
2021-04-18 19:35:41 +08:00

34 lines
979 B
Dart

extension ListExtension<T> on List<T> {
/// Return a new list with only distinct elements
List<T> distinct() {
final s = Set();
return this.where((element) => s.add(element)).toList();
}
/// Return a new list with only distinct elements determined by [equalFn]
List<T> distinctIf(
bool Function(T a, T b) equalFn, int Function(T a) hashCodeFn) {
final s = Set<_DistinctComparator<T>>();
return this
.where((element) =>
s.add(_DistinctComparator<T>(element, equalFn, hashCodeFn)))
.toList();
}
Iterable<T> takeIndex(List<int> indexes) => indexes.map((e) => this[e]);
}
class _DistinctComparator<T> {
_DistinctComparator(this.obj, this.equalFn, this.hashCodeFn);
@override
operator ==(Object other) =>
other is _DistinctComparator<T> && equalFn(obj, other.obj);
@override
get hashCode => hashCodeFn(obj);
final T obj;
final bool Function(T, T) equalFn;
final int Function(T) hashCodeFn;
}