diffCalendars function
Diffs before against after, pairing events by CalendarEvent.id.
Duplicate ids within a single snapshot keep the last occurrence (later entries win), matching map-insert semantics. Order of the returned lists follows iteration over the respective input snapshots.
Example:
final CalendarDiff d = diffCalendars(before, after);
d.added.length; // events only in `after`
d.changed.first; // (before: ..., after: ...) for a moved event
Audited: 2026-06-12 11:26 EDT
Implementation
CalendarDiff diffCalendars(List<CalendarEvent> before, List<CalendarEvent> after) {
final Map<String, CalendarEvent> beforeById = <String, CalendarEvent>{
for (final CalendarEvent e in before) e.id: e,
};
final Map<String, CalendarEvent> afterById = <String, CalendarEvent>{
for (final CalendarEvent e in after) e.id: e,
};
// Added / changed: walk the after snapshot, comparing to the before map.
final List<CalendarEvent> added = <CalendarEvent>[];
final List<CalendarChange> changed = <CalendarChange>[];
for (final CalendarEvent a in afterById.values) {
final CalendarEvent? b = beforeById[a.id];
if (b == null) {
added.add(a);
} else if (!b.sameContentAs(a)) {
changed.add((before: b, after: a));
}
}
// Removed: before entries with no surviving id in after.
final List<CalendarEvent> removed = <CalendarEvent>[
for (final CalendarEvent b in beforeById.values)
if (!afterById.containsKey(b.id)) b,
];
return (added: added, removed: removed, changed: changed);
}