diffCalendars function

CalendarDiff diffCalendars(
  1. List<CalendarEvent> before,
  2. List<CalendarEvent> after
)

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);
}