summaryrefslogtreecommitdiff
path: root/WindowedReader.cs
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2025-04-14 02:41:17 +1000
committerJake Mannens <jake@asger.xyz>2025-04-14 02:41:17 +1000
commit5dfad8e3366d1635aca89d5987d745d89d3d6a9a (patch)
tree6f61a6f34b5e6c42cbbd0b4a9de70e3f559bdd30 /WindowedReader.cs
parentf7490260d5815b7bbce0d3ea03898b2cc754bdce (diff)
Added framework for WindowedReader classsecurity
Diffstat (limited to 'WindowedReader.cs')
-rw-r--r--WindowedReader.cs50
1 files changed, 50 insertions, 0 deletions
diff --git a/WindowedReader.cs b/WindowedReader.cs
new file mode 100644
index 0000000..99c6e01
--- /dev/null
+++ b/WindowedReader.cs
@@ -0,0 +1,50 @@
+using System.Reflection;
+
+namespace HyperBooru;
+
+public class WindowedReader<T> where T : class {
+ public int WindowSize { get; init; } = 200;
+
+ private LinkedList<T> window = new();
+ private IQueryable<T> DataSource { get; set; }
+
+ private object loadLock = new();
+ private Task loadTask = Task.CompletedTask;
+ private LoadOperation currentOperation = LoadOperation.None;
+
+ public WindowedReader(IQueryable<T> dataSource) =>
+ DataSource = dataSource;
+
+ private void DoLoad(LoadOperation operation) {
+ T? bookmark = null;
+ IQueryable<T> 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
+}