dedupeById<T> function

UyavaDeduplicationResult<T> dedupeById<T>(
  1. Iterable<T> entries,
  2. UyavaIdSelector<T> idSelector
)

Applies last-writer-wins deduplication to entries, retaining metadata about conflicts for diagnostics while keeping the most recent payload for each id.

Implementation

UyavaDeduplicationResult<T> dedupeById<T>(
  Iterable<T> entries,
  UyavaIdSelector<T> idSelector,
) {
  final Map<String, UyavaDeduplicatedEntry<T>> latestById =
      <String, UyavaDeduplicatedEntry<T>>{};
  final List<UyavaDuplicateRecord> duplicates = <UyavaDuplicateRecord>[];
  var index = 0;
  for (final T entry in entries) {
    final String? id = idSelector(entry);
    if (id == null || id.isEmpty) {
      index++;
      continue;
    }
    final UyavaDeduplicatedEntry<T>? previous = latestById[id];
    if (previous != null) {
      duplicates.add(
        UyavaDuplicateRecord(
          id: id,
          previousIndex: previous.index,
          nextIndex: index,
        ),
      );
    }
    latestById[id] = UyavaDeduplicatedEntry<T>(value: entry, index: index);
    index++;
  }
  return UyavaDeduplicationResult<T>._(
    latestById: Map<String, UyavaDeduplicatedEntry<T>>.unmodifiable(latestById),
    duplicates: List<UyavaDuplicateRecord>.unmodifiable(duplicates),
  );
}