public static IEnumerable <TVal> Stream <TInd, TVal>( Func <IEnumerableFeed <TInd, TVal> > feedFactory, TInd fromInd = default(TInd), TInd untilInd = default(TInd), bool inReverse = false, IEnumerable <Buffer <TVal> > bufferProvider = null, long maxItemCount = long.MaxValue, Action <IEnumerableFeed <TInd, TVal> > onDispose = null) where TInd : IComparable <TInd> { if (feedFactory == null) { throw new ArgumentNullException("feedFactory"); } IEnumerableFeed <TInd, TVal> feed = feedFactory(); try { foreach (var segm in feed.StreamSegments(fromInd, untilInd, inReverse, bufferProvider, maxItemCount)) { for (int i = segm.Offset; i < segm.Offset + segm.Count; i++) { yield return(segm.Array[i]); } } } finally { if (onDispose != null) { onDispose(feed); } } }
public static IEnumerable <TVal> Stream <TInd, TVal>( this IEnumerableFeed <TInd, TVal> feed, TInd fromInd = default(TInd), TInd untilInd = default(TInd), bool inReverse = false, IEnumerable <Buffer <TVal> > bufferProvider = null, long maxItemCount = long.MaxValue) where TInd : IComparable <TInd> { return(feed.StreamSegments(fromInd, untilInd, inReverse, bufferProvider, maxItemCount).Stream()); }
public static IEnumerable <ArraySegment <TVal> > StreamSegments <TInd, TVal>( this IEnumerableFeed <TInd, TVal> feed, TInd fromInd = default(TInd), TInd untilInd = default(TInd), bool inReverse = false, IEnumerable <Buffer <TVal> > bufferProvider = null, long maxItemCount = long.MaxValue) where TInd : IComparable <TInd> { if (feed == null) { throw new ArgumentNullException("feed"); } return(Utils.IsDefault(untilInd) ? feed.StreamSegments(fromInd, inReverse, bufferProvider, maxItemCount) : StreamSegmentsUntil(feed, fromInd, untilInd, inReverse, bufferProvider, maxItemCount)); }
private static IEnumerable <ArraySegment <TVal> > StreamSegmentsUntil <TInd, TVal>( IEnumerableFeed <TInd, TVal> feed, TInd fromInd, TInd untilInd, bool inReverse, IEnumerable <Buffer <TVal> > bufferProvider, long maxItemCount) where TInd : IComparable <TInd> { Func <TVal, TInd> tsa = feed.IndexAccessor; foreach (var segm in feed.StreamSegments(fromInd, inReverse, bufferProvider, maxItemCount)) { if (segm.Count == 0) { continue; } int comp = tsa(segm.Array[segm.Offset + segm.Count - 1]).CompareTo(untilInd); if (inReverse ? comp >= 0 : comp < 0) { yield return(segm); continue; } var pos = (int) Utils.BinarySearch( untilInd, segm.Offset, segm.Count, false, inReverse, i => tsa(segm.Array[i])); if (pos < 0) { pos = ~pos; } else if (inReverse) { pos++; } if (pos > segm.Offset) { yield return(new ArraySegment <TVal>(segm.Array, segm.Offset, pos - segm.Offset)); } yield break; } }
public FeedConverter( IEnumerableFeed <TInd, TOld> feed, Func <TOld, TNew> converter, Func <TNew, TInd> indexAccessor, Func <TOld, bool> predicate = null) { if (feed == null) { throw new ArgumentNullException("feed"); } if (converter == null) { throw new ArgumentNullException("converter"); } if (indexAccessor == null) { throw new ArgumentNullException("indexAccessor"); } _feed = feed; _indexAccessor = indexAccessor; _converter = converter; _predicate = predicate; }