keepLeaving<T> function
Implementation
List<T> keepLeaving<T>(
List<T> previous,
List<T> next,
Object? Function(T item) keyOf,
) {
final keys = {for (final item in next) keyOf(item)};
final before = <Object?, List<T>>{};
var pending = <T>[];
for (final item in previous) {
final key = keyOf(item);
if (!keys.contains(key)) {
pending.add(item);
} else if (pending.isNotEmpty) {
before[key] = pending;
pending = [];
}
}
return [
for (final item in next) ...[...?before[keyOf(item)], item],
...pending,
];
}