dedupeById<T> function
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),
);
}