summaryrefslogtreecommitdiff
path: root/WindowedReader.cs
blob: 99c6e0178aa9d11291ff858067d5ce592588aaf3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
}