// // ConcurrentDictionaryExtensions.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.Collections.Concurrent; using Remora.Results; namespace NosSmooth.PacketSerializer.Extensions; /// /// Extension methods for . /// public static class ConcurrentDictionaryExtensions { /// /// Adds the value from the factory if it doesn't exist already, /// otherwise returns the existing avlue. /// /// The dictionary. /// The key to add the value at. /// The factory to obtain the value to add. /// The type of the key. /// The type of the value. /// The added value. public static Result GetOrAddResult ( this ConcurrentDictionary dictionary, TKey key, Func> valueFactory ) where TKey : notnull { if (dictionary.TryGetValue(key, out var val)) { return val; } var result = valueFactory(key); if (!result.IsSuccess) { return result; } dictionary.TryAdd(key, result.Entity); return result; } }