/// <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);
        }
示例#2
0
        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);
        }