// Reine Indexrechnung der Warteschlange — bewusst OHNE Importe, damit sie sich ohne DOM und // ohne Wiedergabe pruefen laesst. Hier steckt der Teil, bei dem ein Fehler nicht auffaellt, // sondern spaeter den falschen Titel spielt. /** * Entfernt Position `i`. Liefert den neuen Zeiger und ob der LAUFENDE Titel getroffen wurde. * Der Zeiger wandert mit: faellt ein Titel VOR dem laufenden weg, rutscht dieser eine Stelle vor. */ export function queueNachEntfernen(laenge, qIdx, i) { if (i < 0 || i >= laenge) return { qIdx, warAktuell: false, leer: laenge === 0 }; const warAktuell = i === qIdx; const neueLaenge = laenge - 1; if (neueLaenge === 0) return { qIdx: -1, warAktuell, leer: true }; let neu = qIdx; if (!warAktuell && i < qIdx) neu--; // Traf es den laufenden Titel, zeigt der Index jetzt auf den nachrueckenden — am Ende der // Liste gibt es keinen, dann auf den davor. if (warAktuell) neu = Math.min(neu, neueLaenge - 1); return { qIdx: neu, warAktuell, leer: false }; } /** * Verschiebt `von` nach `nach` und liefert die neue Reihenfolge samt nachgefuehrtem Zeiger. * Der Zeiger wird ueber die POSITION des laufenden Titels neu bestimmt, nicht gerechnet — das * stimmt auch, wenn er selbst gezogen wurde oder ein anderer ueber ihn hinweggezogen ist. */ export function queueNachVerschieben(ids, qIdx, von, nach) { const n = ids.length; if (von === nach || von < 0 || von >= n || nach < 0 || nach >= n) return { ids, qIdx }; const laufende = ids[qIdx]; const neu = ids.slice(); const [x] = neu.splice(von, 1); neu.splice(nach, 0, x); const gefunden = neu.indexOf(laufende); return { ids: neu, qIdx: gefunden >= 0 ? gefunden : qIdx }; }