2022-01-01 18:25:50 +01:00
|
|
|
import 'dart:math' as math;
|
|
|
|
|
2022-06-06 10:33:56 +02:00
|
|
|
import 'package:collection/collection.dart';
|
2022-06-06 12:06:15 +02:00
|
|
|
import 'package:nc_photos/int_extension.dart';
|
2022-06-06 10:33:56 +02:00
|
|
|
|
2021-04-10 06:28:12 +02:00
|
|
|
extension ListExtension<T> on List<T> {
|
|
|
|
Iterable<T> takeIndex(List<int> indexes) => indexes.map((e) => this[e]);
|
2022-01-01 18:25:50 +01:00
|
|
|
|
2022-10-10 18:05:53 +02:00
|
|
|
List<T> slice(int start, [int? stop, int step = 1]) {
|
|
|
|
assert(step > 0);
|
2022-01-01 18:25:50 +01:00
|
|
|
if (start < 0) {
|
|
|
|
start = math.max(length + start, 0);
|
|
|
|
}
|
|
|
|
if (stop != null && stop < 0) {
|
|
|
|
stop = math.max(length + stop, 0);
|
|
|
|
}
|
|
|
|
if (start >= length) {
|
|
|
|
return [];
|
|
|
|
} else if (stop == null) {
|
2022-10-10 18:05:53 +02:00
|
|
|
final sub = sublist(start);
|
|
|
|
if (step <= 1) {
|
|
|
|
return sub;
|
|
|
|
} else {
|
|
|
|
return sub.whereIndexed((index, _) => index % step == 0).toList();
|
|
|
|
}
|
2022-01-01 18:25:50 +01:00
|
|
|
} else if (start >= stop) {
|
|
|
|
return [];
|
|
|
|
} else {
|
2022-10-10 18:05:53 +02:00
|
|
|
final sub = sublist(start, math.min(stop, length));
|
|
|
|
if (step <= 1) {
|
|
|
|
return sub;
|
|
|
|
} else {
|
|
|
|
return sub.whereIndexed((index, _) => index % step == 0).toList();
|
|
|
|
}
|
2022-01-01 18:25:50 +01:00
|
|
|
}
|
|
|
|
}
|
2022-06-06 10:33:56 +02:00
|
|
|
|
|
|
|
void stableSort([int Function(T a, T b)? compare]) {
|
|
|
|
mergeSort(this, compare: compare);
|
|
|
|
}
|
2022-06-06 12:06:15 +02:00
|
|
|
|
|
|
|
/// In-place transform and return this
|
|
|
|
///
|
|
|
|
/// Since the elements are in-place transformed, they have to share the same
|
|
|
|
/// type
|
|
|
|
List<T> transform(T Function(T element) fn) {
|
|
|
|
for (final i in 0.until(length)) {
|
|
|
|
this[i] = fn(this[i]);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
2023-04-13 17:32:31 +02:00
|
|
|
|
|
|
|
Future<List<U>> asyncMap<U>(Future<U> Function(T element) fn) {
|
|
|
|
return Stream.fromIterable(this).asyncMap(fn).toList();
|
|
|
|
}
|
2021-04-10 06:28:12 +02:00
|
|
|
}
|