aboutsummaryrefslogtreecommitdiff
path: root/web/http/nissyapp.mjs
blob: 23e74d0e7dacc755db22fb2d99133369517e5e12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Run ./build web from the main folder before running this example.
// The necessary modules (including worker.mjs) will be built and / or moved
// to this folder when running ./build web.

var solveButton = document.getElementById("solveButton");
var scrField = document.getElementById("scrambleText");
var resultsLabel = document.getElementById("resultsLabel");
var resultsText = document.getElementById("results");
var solverSelector = document.getElementById("solverSelector");

var lastCallbackId = 0;
var callbacks = new Map(); // Values: { f: function, arg: object }
var worker = new Worker("./worker.mjs", { type: "module" });
worker.onmessage = (event) => {
  if (event.data.command == "log") {
    console.log(event.data.object); // TODO
  } else if (!callbacks.has(event.data.id)) {
    console.log("[nissy app] Unknown callback " + event.data.id +
      " for command " + event.data.command);
  } else {
    var callback = callbacks.get(event.data.id);
    callback.f(callback.arg, event.data.arg);
  }
};

function updateResults(label, results, buttonState) {
  resultsLabel.innerText = label;
  resultsText.innerText = results;
  solveButton.disable = !buttonState;
}

solveButton.addEventListener("click", () => {
  updateResults("Loading solutions...", "", false);
  const callbackId = ++lastCallbackId;
  callbacks.set(callbackId, {
    f: (callbackArg, solveResult) => {
      if (solveResult.success) {
        const n = solveResult.solutions.length;
        const label = n == 0 ? "No solution found" :
          ("Found " + n + " solution" + (n == 1 ? "" : "s")) + ":";
        const text = solveResult.solutions.join("\n");
        updateResults(label, text, true);
      } else {
        updateResults("Unexpected error while solving!", "", true);
      }
    },
    arg: "" // Currently unused
  });
  worker.postMessage({
    command: "solve",
    id: callbackId,
    arg: {
      solver: solverSelector.options[solverSelector.selectedIndex].value,
      scramble: scrField.value,
      minmoves: 0,
      maxmoves: 20,
      maxsolutions: 1,
      optimal: 20,
      threads: window.navigator.hardwareConcurrency,
    }
  });
});

Generated with cgit - Back to sebastiano.tronto.net