function sortByIndex(indicies, elems, reverse = true) {
let len = elems.length;
var i = 0;
var toPut = elems[i];
while (i < len) {
let correctIndex = reverse ? len - indicies[i] - 1 : indicies[i];
if (i >= correctIndex) { ++i; } // one problem: there may be forwarding edges which are already processed
else {
var jmp = correctIndex;
while (true) {
let newJmp = reverse ? len - indicies[jmp] - 1 : indicies[jmp];
let newToPut = elems[newJmp];
elems[jmp] = toPut;
if (jmp == i) {
++i;
break;
}
toPut = newToPut;
jmp = newJmp;
};
}
}
return elems;
}