示例#1
0
        public async Task <T> GetOrAddStateAsync <T>(string stateName, T value, CancellationToken cancellationToken = default)
        {
            var condRes = await this.ContainsStateAsync(stateName);

            if (condRes)
            {
                return(await this.GetStateAsync <T>(stateName, cancellationToken));
            }

            this.stateChangeTracker[stateName] = StateMetadata.Create(value, StateChangeAction.Add);
            return(value);
        }
示例#2
0
        public Task SetStateAsync <T>(string stateName, T value, CancellationToken cancellationToken = default)
        {
            if (this.stateChangeTracker.ContainsKey(stateName))
            {
                var stateMetadata = this.stateChangeTracker[stateName];
                stateMetadata.Value        = value;
                stateMetadata.ChangeAction = StateChangeAction.Update;
            }
            else if (!this.stateChangeTracker.ContainsKey(stateName))
            {
                this.stateChangeTracker.Add(stateName, StateMetadata.Create(value, StateChangeAction.Add));
            }
            else
            {
                this.stateChangeTracker[stateName] = StateMetadata.Create(value, StateChangeAction.Update);
            }

            return(Task.CompletedTask);
        }
示例#3
0
        public Task <bool> TryAddStateAsync <T>(string stateName, T value, CancellationToken cancellationToken = default)
        {
            if (this.stateChangeTracker.ContainsKey(stateName))
            {
                var stateMetadata = this.stateChangeTracker[stateName];

                if (stateMetadata.ChangeAction == StateChangeAction.Remove)
                {
                    this.stateChangeTracker[stateName] = StateMetadata.Create(value, StateChangeAction.Update);
                    return(Task.FromResult(true));
                }

                return(Task.FromResult(false));
            }

            if (this.stateChangeTracker.ContainsKey(stateName))
            {
                return(Task.FromResult(false));
            }

            this.stateChangeTracker[stateName] = StateMetadata.Create(value, StateChangeAction.Add);
            return(Task.FromResult(true));
        }
示例#4
0
        public async Task <T> AddOrUpdateStateAsync <T>(string stateName, T addValue, Func <string, T, T> updateValueFactory, CancellationToken cancellationToken = default)
        {
            if (this.stateChangeTracker.ContainsKey(stateName))
            {
                var stateMetadata = this.stateChangeTracker[stateName];

                if (stateMetadata.ChangeAction == StateChangeAction.Remove)
                {
                    this.stateChangeTracker[stateName] = StateMetadata.Create(addValue, StateChangeAction.Update);
                    return(addValue);
                }

                var newValue = updateValueFactory.Invoke(stateName, (T)stateMetadata.Value);
                stateMetadata.Value = newValue;

                if (stateMetadata.ChangeAction == StateChangeAction.None)
                {
                    stateMetadata.ChangeAction = StateChangeAction.Update;
                }

                return(newValue);
            }

            var conditionalResult = await this.TryGetStateAsync <T>(stateName, cancellationToken);

            if (conditionalResult != null)
            {
                var newValue = updateValueFactory(stateName, conditionalResult);
                this.stateChangeTracker.Add(stateName, StateMetadata.Create(newValue, StateChangeAction.Update));

                return(newValue);
            }

            this.stateChangeTracker[stateName] = StateMetadata.Create(addValue, StateChangeAction.Add);
            return(addValue);
        }
示例#5
0
 public Task AddStateAsync <T>(string stateName, T value, CancellationToken cancellationToken = default)
 {
     this.stateChangeTracker.Add(stateName, StateMetadata.Create <T>(value, StateChangeAction.Add));
     return(Task.CompletedTask);
 }