using System.Reflection; namespace HyperBooru; public class WindowedReader where T : class { public int WindowSize { get; init; } = 200; private LinkedList window = new(); private IQueryable DataSource { get; set; } private object loadLock = new(); private Task loadTask = Task.CompletedTask; private LoadOperation currentOperation = LoadOperation.None; public WindowedReader(IQueryable dataSource) => DataSource = dataSource; private void DoLoad(LoadOperation operation) { T? bookmark = null; IQueryable query = DataSource; PropertyInfo orderProperty; switch(operation) { case LoadOperation.InitialLoad: window = new(DataSource.Take(WindowSize)); break; case LoadOperation.LoadPrevious: bookmark = window.FirstOrDefault(); break; case LoadOperation.LoadNext: bookmark = window.LastOrDefault(); break; default: return; } if(bookmark is null) { DoLoad(LoadOperation.InitialLoad); return; } } } public enum LoadOperation { None = 0, InitialLoad, LoadPrevious, LoadNext }