/// <summary> /// Determine a value by deriving it from a previously calculated value and then store the result /// </summary> /// <typeparam name="T">The type of the value</typeparam> /// <param name="provider">Provider for previously defined value as well as the target to store the new value in</param> /// <param name="name">The name of the value</param> /// <param name="update">Function to derive a new value from an old one</param> /// <param name="generate">Function to generate a new value if no old one existed</param> /// <returns>The determined value</returns> public static T DetermineHierarchicalValue <T>(this INamedDataCollection provider, TypedName <T> name, Func <T, T> update, Func <T> generate) where T : IEquatable <T> { Contract.Requires(provider != null); Contract.Requires(update != null); Contract.Requires(generate != null); T value; if (provider.TryGetValue <T>(name, out value)) { var oldValue = value; value = update(oldValue); if (!EqualityComparer <T> .Default.Equals(oldValue, value)) { provider.Set <T>(name, value); } } else { value = generate(); provider.Set <T>(name, value); } return(value); }
public override IReadOnlyList <Vector2> Apply(Func <double> random, INamedDataCollection metadata, IReadOnlyList <Vector2> footprint, IReadOnlyList <Vector2> basis, IReadOnlyList <Vector2> lot) { metadata.Set(new TypedName <T>(_key), _value); return(footprint); }