export interface KeyedQueueEntry { key: string; } export interface QueueItemRemoveAction { absoluteIndex: number; nextEntries: T[]; } export interface SelectedQueueAction { absoluteIndices: number[]; entriesWithSelectedFirst: T[]; entriesWithoutSelected: T[]; } export function removeQueueEntryAt( entries: readonly T[], localIndex: number, baseOffset: number ): QueueItemRemoveAction | null { if (localIndex < 0 || localIndex >= entries.length) return null; return { absoluteIndex: baseOffset + localIndex, nextEntries: entries.filter((_, index) => index !== localIndex), }; } export function resolveSelectedQueueAction( entries: readonly T[], selectedKeys: ReadonlySet, baseOffset: number ): SelectedQueueAction { const selectedEntries: T[] = []; const remainingEntries: T[] = []; const absoluteIndices: number[] = []; entries.forEach((entry, index) => { if (selectedKeys.has(entry.key)) { selectedEntries.push(entry); absoluteIndices.push(baseOffset + index); } else { remainingEntries.push(entry); } }); return { absoluteIndices, entriesWithSelectedFirst: [...selectedEntries, ...remainingEntries], entriesWithoutSelected: remainingEntries, }; }