public void WillCheckPreviousPage() { var scheduler = new TestScheduler(); using (var file = new TestFile()) { file.Append(Enumerable.Range(1, 20).Select(i => i.ToString()).ToArray()); ILineProvider lineProvider = null; using (file.Info.Index(scheduler).Exclude(str => str.Contains("9")).Subscribe(x => lineProvider = x)) { scheduler.AdvanceByMilliSeconds(250); lineProvider.Count.Should().Be(20); var lines = lineProvider.ReadLines(new ScrollRequest(10)).AsArray(); lines.Count().Should().Be(9); var expected = Enumerable.Range(1, 20) .Select(i => i.ToString()) .Where(str => !str.Contains("9")) .Reverse() .Take(10); //slines.Select(line => line.Text).Should().BeEquivalentTo(expected); } } }
public IEnumerable <Line> ReadLinesImpl(ScrollRequest scroll) { var currentPage = _lines.ReadLines(scroll).Where(line => !_itemsToExclude(line.Text)).ToArray(); foreach (var line in currentPage) { yield return(line); } if (currentPage.Length == scroll.PageSize) { yield break; } var deficit = scroll.PageSize - currentPage.Length; //work backwards through the file until we have enough lines var traverseUpTail = YieldTail(scroll.PageSize, scroll.FirstIndex - scroll.PageSize, deficit); foreach (var line in traverseUpTail) { yield return(line); } }