public static ValueTask <(IEntryState <TId, TData> entry, T result)> UpdateEntryAsync <TId, TData, T>(this IEntryStateStorage <TId, TData> entryStorage, IEntryState <TId, TData> entry, Func <IEntryState <TId, TData>, (IEntryState <TId, TData> entry, T result)> update,
public static async ValueTask <IEntryState <TId, TData> > UpdateEntryAsync <TId, TData>(this IEntryStateStorage <TId, TData> entryStorage, IEntryState <TId, TData> entry, Func <IEntryState <TId, TData>, IEntryState <TId, TData> > update, Func <IEntryState <TId, TData>, bool> condition, CancellationToken cancellation) where TData : class { if (entryStorage == null) { throw new ArgumentNullException(nameof(entryStorage)); } if (entry == null) { throw new ArgumentNullException(nameof(entry)); } if (update == null) { throw new ArgumentNullException(nameof(update)); } if (condition == null) { throw new ArgumentNullException(nameof(condition)); } var id = entry.Id; while (condition(entry)) { var desired = update(entry); if (desired == entry) { return(entry); } if (await entryStorage.CompareExchangeAsync(desired, entry, cancellation)) { return(entry = desired); } entry = await entryStorage.GetEntryAsync(id, cancellation); if (entry == null) { return(null); } } return(entry); }
public static async ValueTask <IEntryState <TId, TData> > GetEntryAsync <TId, TData>(this IEntryStateStorage <TId, TData> entryStorage, IEntryState <TId, TData> comparand, CancellationToken cancellation = default) where TData : class { if (entryStorage == null) { throw new ArgumentNullException(nameof(entryStorage)); } if (comparand == null) { throw new ArgumentNullException(nameof(comparand)); } var entries = await entryStorage.GetEntriesAsync(DataPropertyHelper.BuildPredicate(comparand), cancellation); return(entries.FirstOrDefault()); }
public static ValueTask <IEntryState <TId, TData> > UpdateEntryAsync <TId, TData>(this IEntryStateStorage <TId, TData> entryStorage, IEntryState <TId, TData> entry, Func <IEntryState <TId, TData>, IEntryState <TId, TData> > update, CancellationToken cancellation) where TData : class { return(UpdateEntryAsync(entryStorage, entry, update, condition: e => true, cancellation)); }
public static async ValueTask <IEntryState <TId, TData> > GetEntryAsync <TId, TData>(this IEntryStateStorage <TId, TData> entryStorage, Expression <Func <IEntryState <TId, TData>, bool> > predicate, CancellationToken cancellation = default) where TData : class { if (entryStorage == null) { throw new ArgumentNullException(nameof(entryStorage)); } if (predicate == null) { throw new ArgumentNullException(nameof(predicate)); } var entries = await entryStorage.GetEntriesAsync(predicate, cancellation); return(entries.FirstOrDefault()); }