Skip to content
Snippets Groups Projects
Select Git revision
  • d4b0ee7f771a2e6c9302a8d88e5b75e16f940ce0
  • master default protected
2 results

main.js

  • main.js 5.07 KiB
    /// <reference path="../../../p5.global-mode.d.ts" />
    /// <reference path="./visualiser.ts" />
    /// <reference path="./algo.ts" />
    let Bar;
    let sBar;
    let Arr;
    let Algo;
    let AlgoName;
    let Vis;
    let visSelect;
    let algoSelect;
    let sOpts;
    let sReset;
    let sAccessors;
    let sWrites;
    let params;
    let shuffled = false;
    let sorting = false;
    let speed;
    //@ts-ignore
    let count = 0;
    function setup() {
        params = getURLParams();
        if (params["count"])
            Arr = new WatchedArray(parseInt(params["count"]));
        else
            Arr = new WatchedArray(100);
        if (params["speed"])
            speed = parseFloat(params["speed"]);
        else
            speed = 1;
        //@ts-ignore
        Bar = createDiv();
        Bar.id("bar");
        //@ts-ignore
        sBar = createSpan();
        sBar.parent(Bar);
        visSelect = createSelect(false);
        visSelect.parent(sBar);
        for (let v of Visualisers) {
            //@ts-ignore
            visSelect.option(v.name);
        }
        //@ts-ignore
        let ShuffleButton = createButton("Shuffle");
        ShuffleButton.parent(sBar);
        ShuffleButton.mouseClicked(() => {
            Algo = new FisherYates(Arr);
            AlgoName = "shuffle";
            // shuffled = false;
            sorting = true;
        });
        ShuffleButton.doubleClicked(() => {
            if (Algo)
                Algo.sort();
        });
        algoSelect = createSelect(false);
        algoSelect.parent(sBar);
        for (let a of Algorithms) {
            //@ts-ignore
            algoSelect.option(a.name);
        }
        algoSelect.value(params["algo"]);
        algoSelect.input(createOptSels);
        //@ts-ignore
        let SortButton = createButton("Sort");
        SortButton.parent(sBar);
        SortButton.mouseClicked(() => {
            if (shuffled && !sorting) {
                sorting = true;
                if (algoSelect.elt.value) {
                    let A = Algorithms.reduce((a, c) => c.name == algoSelect.elt.value ? c : a, null);
                    let AlgoCon = A.constructor;
                    if (AlgoCon) {
                        Algo = new AlgoCon(Arr);
                        AlgoName = algoSelect.elt.value;
                        //set opts
                        let opts = document.getElementsByClassName("sort_opt");
                        for (let elem of opts) {
                            let id = elem.id.split(':')[1];
                            //@ts-ignore
                            Algo.setOpt(id, A.opts[id].reduce((a, c) => c[0] == elem.value ? c[1] : a, -1));
                        }
                    }
                }
            }
        });
        SortButton.doubleClicked(() => {
            if (Algo)
                Algo.sort();
        });
        //@ts-ignore
        sAccessors = createSpan();
        sAccessors.parent(Bar);
        //@ts-ignore
        sWrites = createSpan();
        sWrites.parent(Bar);
        //@ts-ignore
        sOpts = createSpan();
        sOpts.parent(Bar);
        sOpts.style("margin-left", "10px");
        //@ts-ignore
        sReset = createSpan();
        sReset.parent(Bar);
        sReset.style("position", "relative");
        sReset.style("float", "right");
        //@ts-ignore
        let resetButton = createButton("Reset.");
        resetButton.parent(sReset);
        resetButton.mouseClicked(() => {
            Algo = null;
            if (params["count"])
                Arr = new WatchedArray(parseInt(params["count"]));
            else
                Arr = new WatchedArray(100);
        });
        // resetButton.style("position", "absolute");
        // resetButton.style("right", "0");
        // resetButton.style("position", "absolute");
        createOptSels();
        createCanvas(windowWidth - 40, 700);
    }
    function draw() {
        if (Algo) {
            while (count > 1) {
                Algo.sortIteration();
                count--;
            }
            count += speed;
            if (Algo.getComplete()) {
                Algo = null;
                if (AlgoName == "shuffle") {
                    shuffled = true;
                    Arr.resetStats();
                }
                else {
                    shuffled = false;
                }
                sorting = false;
                AlgoName = null;
            }
        }
        sAccessors.html(`Accesses ${Arr.getAccesses()} | `);
        sWrites.html(`Writes ${Arr.getWrites()}`);
        Vis = Visualisers.reduce((v, c) => c.name == visSelect.value() ? c.fxn : v, null);
        if (Vis)
            Vis(Arr, this);
    }
    function windowResized() {
        resizeCanvas(windowWidth - 30, height);
    }
    function createOptSels() {
        let old_opts = document.getElementsByClassName("sort_opt");
        while (old_opts.length)
            old_opts[0].remove();
        //create new opts
        let algoOpts = Algorithms.reduce((a, c) => c.name == algoSelect.elt.value ? c : a, null).opts;
        if (algoOpts) {
            for (let opt_key in algoOpts) {
                let optSel = createSelect(false);
                optSel.parent(sOpts);
                optSel.addClass("sort_opt");
                optSel.id(`sort_opt:${opt_key}`);
                for (let opt of algoOpts[opt_key]) {
                    //@ts-ignore
                    optSel.option(opt[0]);
                }
                optSel.input(() => {
                    if (Algo) {
                        Algo.setOpt(opt_key, algoOpts[opt_key].reduce((a, c) => c[0] == optSel.value() ? c[1] : a, -1));
                    }
                });
            }
        }
    }
    // new p5(null, document.getElementById("sorter"));
    //@ts-ignore
    new p5(null, "sorter");
    //# sourceMappingURL=main.js.map