| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | // Licensed to the .NET Foundation under one or more agreements.// The .NET Foundation licenses this file to you under the Apache 2.0 License.// See the LICENSE file in the project root for more information. using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace System.Linq{    public static partial class EnumerableEx    {        /// <summary>        ///     Generates a sequence of accumulated values by scanning the source sequence and applying an accumulator function.        /// </summary>        /// <typeparam name="TSource">Source sequence element type.</typeparam>        /// <typeparam name="TAccumulate">Accumulation type.</typeparam>        /// <param name="source">Source sequence.</param>        /// <param name="seed">Accumulator seed value.</param>        /// <param name="accumulator">        ///     Accumulation function to apply to the current accumulation value and each element of the        ///     sequence.        /// </param>        /// <returns>Sequence with all intermediate accumulation values resulting from scanning the sequence.</returns>        public static IEnumerable<TAccumulate> Scan<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> accumulator)        {            if (source == null)                throw new ArgumentNullException(nameof(source));            if (accumulator == null)                throw new ArgumentNullException(nameof(accumulator));            return source.Scan_(seed, accumulator);        }        /// <summary>        ///     Generates a sequence of accumulated values by scanning the source sequence and applying an accumulator function.        /// </summary>        /// <typeparam name="TSource">Source sequence element type.</typeparam>        /// <param name="source">Source sequence.</param>        /// <param name="accumulator">        ///     Accumulation function to apply to the current accumulation value and each element of the        ///     sequence.        /// </param>        /// <returns>Sequence with all intermediate accumulation values resulting from scanning the sequence.</returns>        public static IEnumerable<TSource> Scan<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> accumulator)        {            if (source == null)                throw new ArgumentNullException(nameof(source));            if (accumulator == null)                throw new ArgumentNullException(nameof(accumulator));            return source.Scan_(accumulator);        }        private static IEnumerable<TAccumulate> Scan_<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> accumulator)        {            var acc = seed;            foreach (var item in source)            {                acc = accumulator(acc, item);                yield return acc;            }        }        private static IEnumerable<TSource> Scan_<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> accumulator)        {            var hasSeed = false;            var acc = default(TSource);            foreach (var item in source)            {                if (!hasSeed)                {                    hasSeed = true;                    acc = item;                    continue;                }                acc = accumulator(acc, item);                yield return acc;            }        }    }}
 |