keepLeaving<T> function

List<T> keepLeaving<T>(
  1. List<T> previous,
  2. List<T> next,
  3. Object? keyOf(
    1. T item
    )
)

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,
  ];
}