Exemplo n.º 1
0
        // Anything which maps from IEndPipe to something unlike IEndPipe...

        #region Aggregate<T>(this SourcePipe, AggreationDelegate, DefaultValue = default(T))

        /// <summary>
        /// Safely aggregates the items emitted by the given pipe. If the pipe is null
        /// or has no elements the default value will be returned.
        /// </summary>
        /// <typeparam name="T">The type of the items emitted by the pipe.</typeparam>
        /// <param name="SourcePipe">A pipe.</param>
        /// <param name="AggreationDelegate">The delegate to aggregate the items emitted by the pipe.</param>
        /// <param name="DefaultValue">The default value to return for an empty pipe.</param>
        public static T Aggregate <T>(this IEndPipe <T> SourcePipe,
                                      Func <T, T, T> AggreationDelegate,
                                      T DefaultValue = default(T))
        {
            #region Initial checks

            if (SourcePipe == null)
            {
                return(DefaultValue);
            }

            if (AggreationDelegate == null)
            {
                throw new ArgumentNullException("AggreationDelegate");
            }

            #endregion

            using (var Enumerator = SourcePipe.GetEnumerator())
            {
                if (!Enumerator.MoveNext())
                {
                    return(DefaultValue);
                }

                T Aggregated = Enumerator.Current;

                while (Enumerator.MoveNext())
                {
                    Aggregated = AggreationDelegate(Aggregated, Enumerator.Current);
                }

                return(Aggregated);
            }
        }
Exemplo n.º 2
0
        public static Boolean SequenceEqual <T>(this IEndPipe <T> first,
                                                IEndPipe <T> second,
                                                IEqualityComparer <T> comparer = null)
        {
            if (comparer == null)
            {
                comparer = EqualityComparer <T> .Default;
            }

            using (IEnumerator <T> first_enumerator = first.GetEnumerator(),
                   second_enumerator = second.GetEnumerator())
            {
                while (first_enumerator.MoveNext())
                {
                    if (!second_enumerator.MoveNext())
                    {
                        return(false);
                    }

                    if (!comparer.Equals(first_enumerator.Current, second_enumerator.Current))
                    {
                        return(false);
                    }
                }

                return(!second_enumerator.MoveNext());
            }
        }
Exemplo n.º 3
0
 public IEnumerator <E> GetEnumerator()
 {
     return(EndPipe.GetEnumerator());
 }