All files / algorithms/src shuffle.ts

100% Statements 10/10
100% Branches 0/0
100% Functions 1/1
100% Lines 9/9

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 235x     5x 2x 2x         2x   6x 6x       6x     2x    
import { random } from "./random";
 
// Fisher–Yates algorithm
export const shuffle = <Element>(array: Element[]): Element[] => {
    const sorted = array;
    let currentIndex: number = array.length;
    let randomIndex: number;
 
    // While there remain elements to shuffle...
    // eslint-disable-next-line no-loops/no-loops
    while (currentIndex !== 0) {
        // Pick a remaining element...
        randomIndex = random(0, currentIndex);
        currentIndex -= 1;
 
        // And swap it with the current element.
        // eslint-disable-next-line security/detect-object-injection
        [sorted[currentIndex], sorted[randomIndex]] = [sorted[randomIndex], sorted[currentIndex]];
    }
 
    return sorted;
};