public static VersionedList <T> UpsertWhere <T>(this VersionedList <T> source, Func <T, bool> predicate, T item) { var index = source.IndexOf(predicate); if (index < 0) { return(source.Add(item)); } return(source.SetItem(index, item)); }