/// <summary>
 /// Returns a data-producer that will yield
 /// elements a sequence as long as a condition
 /// is satsified; when the condition fails for an element,
 /// that element and all subsequent elements are ignored.
 /// </summary>
 /// <param name="source">The source data-producer</param>
 /// <param name="predicate">The condition to yield elements</param>
 public static IDataProducer <TSource> TakeWhile <TSource>(this IDataProducer <TSource> source, DotNet20.Func <TSource, bool> predicate)
 {
     predicate.ThrowIfNull("predicate");
     return(source.TakeWhile((x, index) => predicate(x)));
 }