/** Save the row at the current offset; a virtualizer's cached visible range can lag a fling. */export function resolveWorkGroupScrollAnchor(state: { readonly data: ReadonlyArray<{ readonly id: string }>; readonly scroll: number; readonly positionAtIndex: (index: number) => number | undefined;}) { if (state.data.length === 0 || !Number.isFinite(state.scroll)) return undefined; const scrollOffset = Math.max(0, state.scroll); let low = 0; let high = state.data.length - 1; let index = 0; let rowTop = state.positionAtIndex(0); if (rowTop === undefined || !Number.isFinite(rowTop)) return undefined; while (low <= high) { const middle = Math.floor((low + high) / 2); const top = state.positionAtIndex(middle); if (top === undefined || !Number.isFinite(top)) return undefined; if (top <= scrollOffset) { index = middle; rowTop = top; low = middle + 1; } else { high = middle - 1; } } return { rowId: state.data[index]!.id, offsetWithinRow: Math.max(0, scrollOffset - rowTop), scrollOffset, };}
/** Save the row at the current offset; a virtualizer's cached visible range can lag a fling. */
export function resolveWorkGroupScrollAnchor(state: {
readonly data: ReadonlyArray<{ readonly id: string }>;
readonly scroll: number;
readonly positionAtIndex: (index: number) => number | undefined;
}) {
if (state.data.length === 0 || !Number.isFinite(state.scroll)) return undefined;
const scrollOffset = Math.max(0, state.scroll);
let low = 0;
let high = state.data.length - 1;
let index = 0;
let rowTop = state.positionAtIndex(0);
if (rowTop === undefined || !Number.isFinite(rowTop)) return undefined;
while (low <= high) {
const middle = Math.floor((low + high) / 2);
const top = state.positionAtIndex(middle);
if (top === undefined || !Number.isFinite(top)) return undefined;
if (top <= scrollOffset) {
index = middle;
rowTop = top;
low = middle + 1;
} else {
high = middle - 1;
}
}
return {
rowId: state.data[index]!.id,
offsetWithinRow: Math.max(0, scrollOffset - rowTop),
scrollOffset,
};
}