export const generateOffsets = ({ sliderWidth, itemWidth, itemCount, horizontalPadding, }: { sliderWidth: number; itemWidth: number; itemCount: number; horizontalPadding: number; }) => { const padding = (sliderWidth - itemWidth) / 2; const result: number[] = []; for (let i = 0; i < itemCount; i++) { if (i === 0) { result.push(0); } else if (i === itemCount - 1) { result.push(i * itemWidth + 2 * (horizontalPadding - padding)); } else { result.push(i * itemWidth + horizontalPadding - padding); } } return result; }; export const findNearestPage = (offset: number, offsets: number[]): number => { 'worklet'; let lo = 0; let hi = offsets.length - 1; while (hi - lo > 1) { const mid = Math.floor((lo + hi) / 2); if (offsets[mid] < offset) { lo = mid; } else { hi = mid; } } return offset - offsets[lo] <= offsets[hi] - offset ? lo : hi; }; export function getLogicalPage( renderIndex: number, totalItems: number, additionalPagesPerSide: number, loop: boolean ): number { 'worklet'; if (!loop) { return renderIndex; } return (renderIndex - additionalPagesPerSide + totalItems) % totalItems; } export function getLoopBoundaryTarget( renderPage: number, totalPages: number, additionalPagesPerSide: number ): number { 'worklet'; const totalRenderPages = totalPages + additionalPagesPerSide * 2; if (renderPage <= 0) { return totalPages; } if (renderPage >= totalRenderPages - 1) { return renderPage - totalPages; } return -1; }