public static IAsyncIterator <T> WhereAsync <T>(this IAsyncIterator <T> iterator, Func <T, Task <bool> > predicate) { return(AsyncIterator.Create <IAsyncIterator <T>, T>( iterator, async(currentIterator) => { while (true) { var result = await currentIterator.NextAsync(); if (result.HasValue) { var pair = result.ValueOrFailure(); var item = pair.Item1; var nextIterator = pair.Item2; if (await predicate(item)) { return Tuple.Create(item, nextIterator).Some(); } } else { return Option.None <Tuple <T, IAsyncIterator <T> > >(); } } } )); }
public static IAsyncIterator <string> GetLineIteratorAsync(TextReader reader) { return(AsyncIterator.Create <TextReader, string>(reader, async(innerReader) => { var line = await innerReader.ReadLineAsync(); return line.SomeNotNull().Select(l => Tuple.Create(l, innerReader)); })); }
public static IAsyncIterator <S> SelectAsync <T, S>(this IAsyncIterator <T> iterator, Func <T, Task <S> > mapper) { return(AsyncIterator.Create <IAsyncIterator <T>, S>( iterator, async(currentIterator) => { var result = await currentIterator.NextAsync(); if (result.HasValue) { var pair = result.ValueOrFailure(); var item = pair.Item1; var nextIterator = pair.Item2; return Tuple.Create(await mapper(item), nextIterator).Some(); } else { return Option.None <Tuple <S, IAsyncIterator <T> > >(); } } )); }