File size: 1,594 Bytes
3da3d2a
cb94136
 
3da3d2a
 
 
 
 
 
 
 
 
 
cb94136
 
 
 
3da3d2a
 
cb94136
 
 
 
b5b6016
3da3d2a
 
 
 
 
cb94136
 
 
 
 
 
 
 
 
 
 
 
 
3da3d2a
 
 
 
 
 
 
 
 
 
cb94136
 
 
 
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
51
52
53
54
55
56
57
(function (root) {
  "use strict";

  function createSectionVirtualizer({
    limit,
    getLoaded,
    getIndex,
    getHeight,
    virtualize,
    release,
    preserve = (change) => change(),
    canVirtualize = () => true
  }) {
    const maximum = Math.max(3, Number(limit) || 9);
    let disposed = false;

    function trim(centerIndex) {
      if (disposed || !Number.isInteger(centerIndex))
        return { removed: 0, retained: getLoaded().length };
      const loaded = getLoaded();
      const count = Math.max(0, loaded.length - maximum);
      if (!count) return { removed: 0, retained: loaded.length };
      const targets = loaded
        .filter((node) => getIndex(node) !== centerIndex && canVirtualize(node, getIndex(node)))
        .sort(
          (left, right) =>
            Math.abs(getIndex(right) - centerIndex) - Math.abs(getIndex(left) - centerIndex) ||
            getIndex(left) - getIndex(right)
        )
        .slice(0, count);
      let removed = 0;
      preserve(() => {
        for (const node of targets) {
          const index = getIndex(node);
          virtualize(node, index, Math.max(1, getHeight(node)));
          release(index);
          removed += 1;
        }
      });
      return { removed, retained: loaded.length - removed };
    }

    function dispose() {
      disposed = true;
    }
    return Object.freeze({
      trim,
      dispose,
      get limit() {
        return maximum;
      }
    });
  }

  root.VoiceOfMLReaderVirtual = Object.freeze({ createSectionVirtualizer });
})(typeof self !== "undefined" ? self : globalThis);