/// <summary>
 /// Clears the source then copies over the new values while validating every new value.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="setting"></param>
 /// <param name="source"></param>
 /// <param name="newValues"></param>
 public static void SetCollection <T>(this IValueParser <T> setting, ICollection <T> source, ICollection <T> newValues)
 {
     source.Clear();
     foreach (var singleValue in newValues)
     {
         setting.ThrowIfInvalid(singleValue);
         source.Add(singleValue);
     }
 }
        /// <summary>
        /// Modifies the collection in the specified way.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="setting"></param>
        /// <param name="source"></param>
        /// <param name="value"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public static IResult ModifyCollection <T>(this IValueParser <T> setting, ICollection <T> source, T value, Context context)
        {
            setting.ThrowIfInvalid(value);

            bool success;

            switch (context.Action)
            {
            case CollectionModificationAction.Toggle:
                var rCount = source.RemoveAll(value, setting.EqualityComparer, context.MaxRemovalCount);
                if (rCount <= 0)                         //Only add if nothing was removed
                {
                    source.Add(value);
                }
                success = true;
                break;

            case CollectionModificationAction.Add:
                source.Add(value);
                success = true;
                break;

            case CollectionModificationAction.AddIfMissing:
                var contains = source.Contains(value, setting.EqualityComparer);
                if (!contains)                         //Only add if not contained in collection
                {
                    source.Add(value);
                }
                success = !contains;
                break;

            case CollectionModificationAction.Remove:
                success = source.RemoveAll(value, setting.EqualityComparer, context.MaxRemovalCount) > 0;                         //Failure if removed nothing
                break;

            default:
                throw new ArgumentException("Invalid action supplied.", nameof(context));
            }

            return(success
                                ? SetValueResult.FromSuccess(setting, value, $"Successfully {context.ActionString}.")
                                : SetValueResult.FromError(setting, value, $"Already {context.ActionString}."));
        }