Пример #1
0
 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,
Пример #2
0
        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);
        }
Пример #3
0
        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());
        }
Пример #4
0
 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));
 }
Пример #5
0
        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());
        }