mergeCustomProviderEntries function

List<CustomProviderEntry> mergeCustomProviderEntries(
  1. List<CustomProviderEntry> caller,
  2. List<CustomProviderEntry> onDisk
)

The merge-before-write union for the customProviders: section (issue #221): caller is the saving process's intended list, onDisk the freshly re-read list. Caller's entries win per name (case-insensitive) — an in-flight edit lands — while on-disk entries the caller never loaded survive (no stale-snapshot clobber). Reserved (catalog-named) entries are dropped from the result so a ghost can never persist.

Implementation

List<CustomProviderEntry> mergeCustomProviderEntries(
  List<CustomProviderEntry> caller,
  List<CustomProviderEntry> onDisk,
) {
  final callerNames = {for (final e in caller) e.name.toLowerCase()};
  return [
    for (final e in caller)
      if (!isReservedCustomProviderName(e.name)) e,
    for (final e in onDisk)
      if (!callerNames.contains(e.name.toLowerCase()) &&
          !isReservedCustomProviderName(e.name))
        e,
  ];
}