diff --git a/src/interaction/slaveInteract.js b/src/interaction/slaveInteract.js index 1207467e07fc45a09ecbbc97e51ae7f41e9bfa4f..c35674903bb51c4fd4dc12c2ebdd11648a33af5a 100644 --- a/src/interaction/slaveInteract.js +++ b/src/interaction/slaveInteract.js @@ -1,63 +1,24 @@ /* eslint-disable no-unused-vars */ // TODO: remove after testing App.UI.SlaveInteract.placeInLine = function(slave) { - let slavesInLine = []; - let activeSlaveIndex = V.slaveIndices[slave.ID]; - let SL = V.slaves.length; - - if (assignmentVisible(slave)) { - for (let pil = activeSlaveIndex - 1; pil !== activeSlaveIndex; pil--) { - /* loops backwards through the V.slaves array */ - if (pil < 0) { - pil = SL; - continue; - } - if (assignmentVisible(V.slaves[pil])) { - slavesInLine.push(pil); /* index of the previous slave in line */ - break; - } - } - for (let pil = activeSlaveIndex + 1; pil !== activeSlaveIndex; pil++) { - /* this loops forwards through the V.slaves array */ - if (pil === SL) { - pil = -1; - continue; - } - if (assignmentVisible(V.slaves[pil])) { - slavesInLine.push(pil); /* index of the next slave in line */ - break; - } - } + const useSlave = assignmentVisible(slave) ? ((s) => assignmentVisible(s)) : ((s) => slave.assignment === s.assignment); + const slaveList = V.slaves.filter(useSlave); + SlaveSort.slaves(slaveList); + const curSlaveIndex = slaveList.findIndex((s) => s.ID === slave.ID); + + let nextIndex; + if (curSlaveIndex + 1 > slaveList.length - 1) { + nextIndex = 0; // wrap around to first slave } else { - for (let pil = activeSlaveIndex - 1; pil !== activeSlaveIndex; pil--) { - /* loops backwards through the V.slaves array */ - if (pil < 0) { - pil = SL; - continue; - } - if (V.slaves[pil].assignment === slave.assignment) { - slavesInLine.push(pil); /* index of the previous slave in line */ - break; - } - } - for (let pil = activeSlaveIndex + 1; pil !== activeSlaveIndex; pil++) { - /* this loops forwards through the V.slaves array */ - if (pil === SL) { - pil = -1; - continue; - } - if (V.slaves[pil].assignment === slave.assignment) { - slavesInLine.push(pil); /* index of the next slave in line */ - break; - } - } + nextIndex = curSlaveIndex + 1; } - - if (slavesInLine.length === 0) { - /* if there are no other slaves available, set previous/next slave to self */ - slavesInLine[0] = activeSlaveIndex; - slavesInLine[1] = activeSlaveIndex; + let prevIndex; + if (curSlaveIndex - 1 < 0) { + prevIndex = slaveList.length - 1; // wrap around to last slave + } else { + prevIndex = curSlaveIndex - 1; } - return slavesInLine; + + return [ slaveList[prevIndex].ID, slaveList[nextIndex].ID ]; }; App.UI.SlaveInteract.fucktoyPref = function(slave) { diff --git a/src/js/assayJS.js b/src/js/assayJS.js index 68a3ec9ed0ccd585dddf27bfd0ceaca48e6f66f4..443245cab40d35fdf0d9db577e6925db32b0b014 100644 --- a/src/js/assayJS.js +++ b/src/js/assayJS.js @@ -1534,7 +1534,17 @@ window.SlaveSort = function() { */ /** @returns {slaveComparator} */ function _comparator() { - return comparators[(V.sortSlavesOrder === "ascending" ? 'A' : 'D') + V.sortSlavesBy]; + return _makeStableComparator(comparators[(V.sortSlavesOrder === "ascending" ? 'A' : 'D') + V.sortSlavesBy]); + } + + /** secondary-sort by ascending ID if the primary comparator would return 0 (equal), so we have a guaranteed stable order regardless of input + * @param {slaveComparator} comparator + * @returns {slaveComparator} + */ + function _makeStableComparator(comparator) { + return function(a, b) { + return comparator(a, b) || comparators.AID(a, b); + }; } }(); diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw index 160884934a9fb84235d88c74b22dfbac6e5f6a6a..27b6312ae845bbda60c3feb2ffb1b682c1375830 100644 --- a/src/uncategorized/slaveInteract.tw +++ b/src/uncategorized/slaveInteract.tw @@ -66,7 +66,7 @@ [←,Q] </span> <span id="prevSlave" style="font-weight:bold"> - <<link "Prev" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = $slaves[_slavesInLine[0]]>><</link>> + <<link "Prev" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = getSlave(_slavesInLine[0])>><</link>> </span> <span class='slave-name'> @@ -74,7 +74,7 @@ </span> <span id="nextSlave" style="font-weight:bold"> - <<link "Next" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = $slaves[_slavesInLine[1]]>><</link>> + <<link "Next" "Slave Interact">><<set $slaves[_i] = $activeSlave, $activeSlave = getSlave(_slavesInLine[1])>><</link>> </span> <span class="cyan"> [E,→]