38 lines
1.7 KiB
JavaScript
38 lines
1.7 KiB
JavaScript
// 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 };
|
|
}
|