/// <summary>
        /// Apply the previously specified action to all elements except the last and then apply a different action to the last one.
        /// </summary>
        /// <param name="sequence"></param>
        /// <param name="action"></param>
        /// <typeparam name="T"></typeparam>
        public static void ToAllWithDifferentLast <T>(this IActionApplyingEnumerable <T> sequence, Action <T> action)
        {
            if (sequence == null)
            {
                throw new ArgumentNullException(nameof(sequence));
            }

            using (var iterator = sequence.Sequence.GetEnumerator())
            {
                var previous = default(T);
                var any      = false;
                while (iterator.MoveNext())
                {
                    if (any)
                    {
                        sequence.Action.Invoke(previous);
                    }
                    previous = iterator.Current;
                    any      = true;
                }
                if (any)
                {
                    action.Invoke(previous);
                }
            }
        }
        /// <summary>
        /// Apply the previously specified action to all elements except for the last one.
        /// </summary>
        /// <param name="sequence"></param>
        /// <typeparam name="T"></typeparam>
        public static void ToAllExceptLast <T>(this IActionApplyingEnumerable <T> sequence)
        {
            if (sequence == null)
            {
                throw new ArgumentNullException(nameof(sequence));
            }

            foreach (var a in sequence.Sequence.ButLast())
            {
                sequence.Action.Invoke(a);
            }
        }
        /// <summary>
        /// Apply the previously specified action to all elements and then apply an additional action to the last one.
        /// </summary>
        /// <param name="sequence">Items.</param>
        /// <param name="action">Action.</param>
        /// <typeparam name="T">The 1st type parameter.</typeparam>
        public static void ToAllAndThenApplyToLast <T>(this IActionApplyingEnumerable <T> sequence, Action <T> action)
        {
            if (sequence == null)
            {
                throw new ArgumentNullException(nameof(sequence));
            }

            var outer = default(T);
            var any   = false;

            foreach (var a in sequence.Sequence)
            {
                outer = a;
                sequence.Action.Invoke(a);
                any = true;
            }
            if (any)
            {
                action.Invoke(outer);
            }
        }