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);
|