Ejemplo n.º 1
0
        /// <summary>
        /// Takes the input enumerable and produces a new enumerable by passing
        /// each value through the supplied transducer one-by-one and yielding
        /// the results.
        /// </summary>
        /// <typeparam name="TInput">The type of the input.</typeparam>
        /// <typeparam name="TResult">The type of the result.</typeparam>
        /// <param name="input">The input.</param>
        /// <param name="transducer">The transducer.</param>
        /// <returns>
        /// An enumerable that is a sequence of values after the input is applied to
        /// the supplied transducer.
        /// </returns>
        public static IEnumerable <TResult> Transduce <TInput, TResult>(
            this IEnumerable <TInput> input,
            ITransducer <TInput, TResult> transducer)
        {
            var reducer = transducer.Apply(Enumerating.ListReducer <TResult>());
            var list    = new List <TResult>();

            foreach (var value in input)
            {
                var reduction = reducer.Invoke(list, value);

                foreach (var result in reduction.Value)
                {
                    yield return(result);
                }

                if (reduction.IsTerminated)
                {
                    yield break;
                }

                list.Clear();
            }

            var completionReduction = reducer.Complete(list);

            foreach (var result in completionReduction.Value)
            {
                yield return(result);
            }
        }
Ejemplo n.º 2
0
 public static IReducer <TextWriter, TInput> WriteReducer <TInput, TResult>(
     this ITransducer <TInput, TResult> transducer) => transducer.Apply(WriteReducer <TResult>());
Ejemplo n.º 3
0
 /// <summary>
 /// Passes results from some TextReader through the supplied transducer to some TextWriter.
 /// </summary>
 /// <typeparam name="TResult">The type the transducer produces.</typeparam>
 /// <param name="input">The input.</param>
 /// <param name="output">The output.</param>
 /// <param name="transducer">The transducer.</param>
 public static void Transduce <TResult>(
     this TextReader input,
     TextWriter output,
     ITransducer <string, TResult> transducer) =>
 input.Reduce(output, transducer.Apply(WriteReducer <TResult>()));
Ejemplo n.º 4
0
 public AsyncPrimary(
     ITransducer <TInput, TInput> operation,
     IAsyncReducer <TReduction, TInput> next)
 {
     Next = operation.Apply(new AsyncTail <TReduction>(this, next));
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Passes the values from the enumerable through the supplied transducer and
 /// collects the results into a list.
 /// </summary>
 /// <typeparam name="TInput">The type of the input.</typeparam>
 /// <typeparam name="TResult">The type of the result.</typeparam>
 /// <param name="input">The input.</param>
 /// <param name="transducer">The transducer.</param>
 /// <returns>A list of the computed results.</returns>
 public static IList <TResult> Collect <TInput, TResult>(
     this IEnumerable <TInput> input,
     ITransducer <TInput, TResult> transducer) =>
 input.Reduce(new List <TResult>(), transducer.Apply(ListReducer <TResult>())).Value;
Ejemplo n.º 6
0
        public static void SequenceEquivalent <T, U>(IEnumerable <T> input, IList <U> result, ITransducer <T, U> transducer)
        {
            var termination = input.Reduce(0, transducer.Apply(new VerifySequence <U>(result)));

            Assert.IsTrue(termination.IsTerminated);
        }