function chunkedSelectionSort(arr, steps = 1000) { return new Promise((resolve, reject) => { let i = 0; let j = i + 1; let lowestIdx = i; function sortStep() { // Find lowest index while(j < arr.length) { if (arr[j] < arr[lowestIdx]) { lowestIdx = j; } j += 1; if (j % steps === 0) { // Yield thread, recurse setTimeout(sortStep, 0); } } // Base case, exit if (lowestIdx === i) return resolve(arr); // Swap found lower value const tmp = arr[i]; arr[i] = arr[lowestIdx]; arr[lowestIdx] = tmp; // Increment pointers i += 1; j = i + 1; lowestIdx = i; } sortStep(); }); }