@rednaxela101/cubing 0.63.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +120 -0
- package/alg/index.d.ts +1 -0
- package/bluetooth/index.d.ts +1 -0
- package/dist/bin/chunks/chunk-22VWCGBC.js +13 -0
- package/dist/bin/chunks/chunk-22VWCGBC.js.map +7 -0
- package/dist/bin/order.js +59 -0
- package/dist/bin/order.js.map +7 -0
- package/dist/bin/puzzle-geometry-bin.js +407 -0
- package/dist/bin/puzzle-geometry-bin.js.map +7 -0
- package/dist/bin/scramble.js +188 -0
- package/dist/bin/scramble.js.map +7 -0
- package/dist/bin/svg.js +56 -0
- package/dist/bin/svg.js.map +7 -0
- package/dist/lib/cubing/alg/index.d.ts +2 -0
- package/dist/lib/cubing/alg/index.js +43 -0
- package/dist/lib/cubing/alg/index.js.map +7 -0
- package/dist/lib/cubing/bluetooth/index.d.ts +189 -0
- package/dist/lib/cubing/bluetooth/index.js +2271 -0
- package/dist/lib/cubing/bluetooth/index.js.map +7 -0
- package/dist/lib/cubing/chunks/big-puzzle-orientation-BA6QHO5C.js +68 -0
- package/dist/lib/cubing/chunks/big-puzzle-orientation-BA6QHO5C.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-2VJB4TMH.js +1774 -0
- package/dist/lib/cubing/chunks/chunk-2VJB4TMH.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-52ZXJEUO.js +665 -0
- package/dist/lib/cubing/chunks/chunk-52ZXJEUO.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-56VZAEPF.js +274 -0
- package/dist/lib/cubing/chunks/chunk-56VZAEPF.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-7GUL3OBQ.js +9 -0
- package/dist/lib/cubing/chunks/chunk-7GUL3OBQ.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-7L7BJSIM.js +21 -0
- package/dist/lib/cubing/chunks/chunk-7L7BJSIM.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-AESPJKN6.js +265 -0
- package/dist/lib/cubing/chunks/chunk-AESPJKN6.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-C2Q347XS.js +89 -0
- package/dist/lib/cubing/chunks/chunk-C2Q347XS.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-CGBMJBU3.js +1195 -0
- package/dist/lib/cubing/chunks/chunk-CGBMJBU3.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-HZQONEMD.js +249 -0
- package/dist/lib/cubing/chunks/chunk-HZQONEMD.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-IAGCVPL3.js +1069 -0
- package/dist/lib/cubing/chunks/chunk-IAGCVPL3.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-NAPITA3L.js +1 -0
- package/dist/lib/cubing/chunks/chunk-NAPITA3L.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-XPDJUSZ7.js +1876 -0
- package/dist/lib/cubing/chunks/chunk-XPDJUSZ7.js.map +7 -0
- package/dist/lib/cubing/chunks/chunk-YSI6PF35.js +619 -0
- package/dist/lib/cubing/chunks/chunk-YSI6PF35.js.map +7 -0
- package/dist/lib/cubing/chunks/inside-LG2EAKCL.js +557 -0
- package/dist/lib/cubing/chunks/inside-LG2EAKCL.js.map +7 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-2x2x2-JYJJXB4V.js +142 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-2x2x2-JYJJXB4V.js.map +7 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-3x3x3-FYXD7SIU.js +365 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-3x3x3-FYXD7SIU.js.map +7 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-4x4x4-AIGABOAR.js +132 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-4x4x4-AIGABOAR.js.map +7 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-5x5x5-JUNRX27W.js +277 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-5x5x5-JUNRX27W.js.map +7 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-clock-USGQTDPO.js +836 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-clock-USGQTDPO.js.map +7 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-fto-WJHMLYCJ.js +100 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-fto-WJHMLYCJ.js.map +7 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-megaminx-2LVHIDL4.js +224 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-megaminx-2LVHIDL4.js.map +7 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-pyraminx-7UWX4HHI.js +93 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-pyraminx-7UWX4HHI.js.map +7 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-square1-PQEKBPFN.js +842 -0
- package/dist/lib/cubing/chunks/puzzles-dynamic-square1-PQEKBPFN.js.map +7 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-2x2x2-XFKQ4VJS.js +125 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-2x2x2-XFKQ4VJS.js.map +7 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-megaminx-ZDOOLEDW.js +1564 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-megaminx-ZDOOLEDW.js.map +7 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-pyraminx-W6UJWBYY.js +108 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-pyraminx-W6UJWBYY.js.map +7 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-skewb-FXGKV4KD.js +125 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-skewb-FXGKV4KD.js.map +7 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-YK6HA7BK.js +644 -0
- package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-YK6HA7BK.js.map +7 -0
- package/dist/lib/cubing/chunks/search-dynamic-solve-3x3x3-DLMAGPXS.js +2549 -0
- package/dist/lib/cubing/chunks/search-dynamic-solve-3x3x3-DLMAGPXS.js.map +7 -0
- package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-NONXQHOJ.js +2923 -0
- package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-NONXQHOJ.js.map +7 -0
- package/dist/lib/cubing/chunks/search-dynamic-solve-fto-3GQ2HLSW.js +1405 -0
- package/dist/lib/cubing/chunks/search-dynamic-solve-fto-3GQ2HLSW.js.map +7 -0
- package/dist/lib/cubing/chunks/search-worker-entry.js +19 -0
- package/dist/lib/cubing/chunks/search-worker-entry.js.map +7 -0
- package/dist/lib/cubing/chunks/square1-stickerings-W2ZLZWIN.js +73 -0
- package/dist/lib/cubing/chunks/square1-stickerings-W2ZLZWIN.js.map +7 -0
- package/dist/lib/cubing/chunks/twips-2RNTWYNZ.js +433 -0
- package/dist/lib/cubing/chunks/twips-2RNTWYNZ.js.map +7 -0
- package/dist/lib/cubing/chunks/twips_wasm_bg-TJNYGA2C-23XTPLIK.js +10 -0
- package/dist/lib/cubing/chunks/twips_wasm_bg-TJNYGA2C-23XTPLIK.js.map +7 -0
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-JO6OGKOF.js +2424 -0
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-JO6OGKOF.js.map +7 -0
- package/dist/lib/cubing/index-BX6f56uo.d.ts +76 -0
- package/dist/lib/cubing/index-CcRu94bx.d.ts +2622 -0
- package/dist/lib/cubing/kpuzzle/index.d.ts +2 -0
- package/dist/lib/cubing/kpuzzle/index.js +12 -0
- package/dist/lib/cubing/kpuzzle/index.js.map +7 -0
- package/dist/lib/cubing/notation/index.d.ts +32 -0
- package/dist/lib/cubing/notation/index.js +20 -0
- package/dist/lib/cubing/notation/index.js.map +7 -0
- package/dist/lib/cubing/outside-BCzgSYQ_.d.ts +38 -0
- package/dist/lib/cubing/protocol/index.d.ts +28 -0
- package/dist/lib/cubing/protocol/index.js +20 -0
- package/dist/lib/cubing/protocol/index.js.map +7 -0
- package/dist/lib/cubing/puzzle-geometry/index.d.ts +2 -0
- package/dist/lib/cubing/puzzle-geometry/index.js +5024 -0
- package/dist/lib/cubing/puzzle-geometry/index.js.map +7 -0
- package/dist/lib/cubing/puzzles/index.d.ts +2 -0
- package/dist/lib/cubing/puzzles/index.js +23 -0
- package/dist/lib/cubing/puzzles/index.js.map +7 -0
- package/dist/lib/cubing/scramble/index.d.ts +2 -0
- package/dist/lib/cubing/scramble/index.js +16 -0
- package/dist/lib/cubing/scramble/index.js.map +7 -0
- package/dist/lib/cubing/search/index.d.ts +7 -0
- package/dist/lib/cubing/search/index.js +37 -0
- package/dist/lib/cubing/search/index.js.map +7 -0
- package/dist/lib/cubing/stream/index.d.ts +2 -0
- package/dist/lib/cubing/stream/index.js +111 -0
- package/dist/lib/cubing/stream/index.js.map +7 -0
- package/dist/lib/cubing/twisty/index.d.ts +2 -0
- package/dist/lib/cubing/twisty/index.js +6236 -0
- package/dist/lib/cubing/twisty/index.js.map +7 -0
- package/experimental-json-schema/kpuzzle/KPatternData.schema.json +34 -0
- package/experimental-json-schema/kpuzzle/KPuzzleDefinition.schema.json +97 -0
- package/experimental-json-schema/kpuzzle/KTransformationData.schema.json +27 -0
- package/kpuzzle/index.d.ts +1 -0
- package/notation/index.d.ts +1 -0
- package/package.json +146 -0
- package/protocol/index.d.ts +1 -0
- package/puzzle-geometry/index.d.ts +1 -0
- package/puzzles/index.d.ts +1 -0
- package/scramble/index.d.ts +1 -0
- package/search/index.d.ts +1 -0
- package/stream/index.d.ts +1 -0
- package/twisty/index.d.ts +1 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --
|
|
2
|
+
import {
|
|
3
|
+
packageVersion
|
|
4
|
+
} from "./chunks/chunk-22VWCGBC.js";
|
|
5
|
+
|
|
6
|
+
// src/bin/scramble.ts
|
|
7
|
+
import { basename } from "node:path";
|
|
8
|
+
import { argv } from "node:process";
|
|
9
|
+
import {
|
|
10
|
+
argument,
|
|
11
|
+
choice,
|
|
12
|
+
integer,
|
|
13
|
+
map,
|
|
14
|
+
merge,
|
|
15
|
+
message,
|
|
16
|
+
object,
|
|
17
|
+
option,
|
|
18
|
+
withDefault
|
|
19
|
+
} from "@optique/core";
|
|
20
|
+
import { run } from "@optique/run";
|
|
21
|
+
import { eventInfo, twizzleEvents } from "@rednaxela101/cubing/puzzles";
|
|
22
|
+
import { randomScrambleForEvent } from "@rednaxela101/cubing/scramble";
|
|
23
|
+
import { setSearchDebug } from "@rednaxela101/cubing/search";
|
|
24
|
+
var outputFormats = ["auto", "text", "link", "json-text"];
|
|
25
|
+
var notationTypes = ["auto", "LGN"];
|
|
26
|
+
var eventIDs = Object.entries(twizzleEvents).filter(([_, eventInfo2]) => !!eventInfo2.scramblesImplemented).map(([eventID2, _]) => eventID2);
|
|
27
|
+
var args = run(
|
|
28
|
+
merge(
|
|
29
|
+
object({
|
|
30
|
+
amount: withDefault(
|
|
31
|
+
option("--amount", "-n", integer({ metavar: "AMOUNT", min: 1 }), {
|
|
32
|
+
description: message`Amount of scrambles.`
|
|
33
|
+
}),
|
|
34
|
+
1
|
|
35
|
+
),
|
|
36
|
+
notation: withDefault(
|
|
37
|
+
option("--notation", choice(notationTypes, { metavar: "NOTATION" })),
|
|
38
|
+
"auto"
|
|
39
|
+
)
|
|
40
|
+
}),
|
|
41
|
+
object({
|
|
42
|
+
format: withDefault(
|
|
43
|
+
option("--format", "-f", choice(outputFormats, { metavar: "FORMAT" })),
|
|
44
|
+
"auto"
|
|
45
|
+
)
|
|
46
|
+
}),
|
|
47
|
+
object({
|
|
48
|
+
// TODO: consolidate this with `format`: https://github.com/dahlia/optique/issues/57
|
|
49
|
+
text: map(
|
|
50
|
+
option("--text", "-t", {
|
|
51
|
+
description: message`Convenient shorthand for \`--format text\`.`
|
|
52
|
+
}),
|
|
53
|
+
() => "text"
|
|
54
|
+
)
|
|
55
|
+
}),
|
|
56
|
+
object({
|
|
57
|
+
eventID: argument(choice(eventIDs, { metavar: "EVENT_ID" }), {
|
|
58
|
+
description: message`WCA or unoffiical event ID.`
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
),
|
|
62
|
+
{
|
|
63
|
+
programName: basename(argv[1]),
|
|
64
|
+
description: message`Example: order 3x3x3 "R U R' U R U2' R'"`,
|
|
65
|
+
help: "option",
|
|
66
|
+
completion: {
|
|
67
|
+
option: {
|
|
68
|
+
names: ["--completions"],
|
|
69
|
+
hidden: false
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
version: {
|
|
73
|
+
option: {
|
|
74
|
+
hidden: false
|
|
75
|
+
},
|
|
76
|
+
value: packageVersion
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
var { amount, format: argsFormat, notation, text, eventID } = args;
|
|
81
|
+
var format = argsFormat ?? text ?? (!process.stdout.isTTY ? "text" : "auto");
|
|
82
|
+
setSearchDebug({ logPerf: false, showWorkerInstantiationWarnings: false });
|
|
83
|
+
function scrambleText(scramble) {
|
|
84
|
+
return scramble.toString({
|
|
85
|
+
// TODO: any
|
|
86
|
+
notation
|
|
87
|
+
// TODO: handle type conversion at arg parse time.
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function scrambleLink(scramble) {
|
|
91
|
+
const url = new URL("https://alpha.twizzle.net/edit/");
|
|
92
|
+
const puzzleID = eventInfo(eventID)?.puzzleID;
|
|
93
|
+
puzzleID && url.searchParams.set("puzzle", puzzleID);
|
|
94
|
+
url.searchParams.set("alg", scrambleText(scramble));
|
|
95
|
+
return url.toString();
|
|
96
|
+
}
|
|
97
|
+
var JSONListPrinter = class {
|
|
98
|
+
#finished = false;
|
|
99
|
+
#firstValuePrintedAlready = false;
|
|
100
|
+
constructor() {
|
|
101
|
+
process.stdout.write("[\n ");
|
|
102
|
+
}
|
|
103
|
+
push(value) {
|
|
104
|
+
if (this.#firstValuePrintedAlready) {
|
|
105
|
+
process.stdout.write(",\n ");
|
|
106
|
+
}
|
|
107
|
+
this.#firstValuePrintedAlready = true;
|
|
108
|
+
process.stdout.write(JSON.stringify(value));
|
|
109
|
+
}
|
|
110
|
+
finish() {
|
|
111
|
+
if (this.#finished) {
|
|
112
|
+
throw new Error("Tried to finish JSON list printing multiple times.");
|
|
113
|
+
}
|
|
114
|
+
this.#finished = true;
|
|
115
|
+
console.log("\n]");
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
function nodeForgetTopLevelAwaitWorkaround(_promise) {
|
|
119
|
+
return Promise.resolve();
|
|
120
|
+
}
|
|
121
|
+
await nodeForgetTopLevelAwaitWorkaround(
|
|
122
|
+
(async () => {
|
|
123
|
+
if (format !== "json-text" && amount === 1) {
|
|
124
|
+
const scramble = await randomScrambleForEvent(eventID);
|
|
125
|
+
switch (format) {
|
|
126
|
+
case "auto": {
|
|
127
|
+
console.log(`${scrambleText(scramble)}
|
|
128
|
+
|
|
129
|
+
\u{1F517} ${scrambleLink(scramble)}`);
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
case "text": {
|
|
133
|
+
console.log(scrambleText(scramble));
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case "link": {
|
|
137
|
+
console.log(scrambleLink(scramble));
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
// @ts-expect-error This is a code guard for future refactoring.
|
|
141
|
+
case "json-text": {
|
|
142
|
+
throw new Error(
|
|
143
|
+
"Encountered `json` format in code that is not expected to handle it."
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
default: {
|
|
147
|
+
throw new Error("Invalid format!");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
} else {
|
|
151
|
+
const jsonListPrinter = format === "json-text" ? new JSONListPrinter() : void 0;
|
|
152
|
+
for (let i = 0; i < amount; i++) {
|
|
153
|
+
const scramble = await randomScrambleForEvent(eventID);
|
|
154
|
+
switch (format) {
|
|
155
|
+
case "auto": {
|
|
156
|
+
console.log(`// Scramble #${i + 1}
|
|
157
|
+
${scrambleText(scramble)}
|
|
158
|
+
|
|
159
|
+
\u{1F517} ${scrambleLink(scramble)}
|
|
160
|
+
`);
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case "text": {
|
|
164
|
+
console.log(`// Scramble #${i + 1}`);
|
|
165
|
+
console.log(`${scrambleText(scramble)}
|
|
166
|
+
`);
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case "link": {
|
|
170
|
+
console.log(`// Scramble #${i + 1}`);
|
|
171
|
+
console.log(`${scrambleLink(scramble)}
|
|
172
|
+
`);
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
case "json-text": {
|
|
176
|
+
jsonListPrinter?.push(scramble.toString());
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
default: {
|
|
180
|
+
throw new Error("Invalid format!");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
jsonListPrinter?.finish();
|
|
185
|
+
}
|
|
186
|
+
})()
|
|
187
|
+
);
|
|
188
|
+
//# sourceMappingURL=scramble.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/bin/scramble.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/scramble.ts 333\n```\n\nTo add a `scramble` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\nscramble --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(scramble --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport {\n argument,\n choice,\n integer,\n map,\n merge,\n message,\n object,\n option,\n withDefault,\n} from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport type { Alg } from \"@rednaxela101/cubing/alg\";\nimport { eventInfo, twizzleEvents } from \"@rednaxela101/cubing/puzzles\";\nimport { randomScrambleForEvent } from \"@rednaxela101/cubing/scramble\";\nimport { setSearchDebug } from \"@rednaxela101/cubing/search\";\nimport { packageVersion } from \"../metadata/packageVersion\";\n\nconst outputFormats = [\"auto\", \"text\", \"link\", \"json-text\"] as const;\nconst notationTypes = [\"auto\", \"LGN\"] as const;\nconst eventIDs = Object.entries(twizzleEvents)\n .filter(([_, eventInfo]) => !!eventInfo.scramblesImplemented)\n .map(([eventID, _]) => eventID);\n\nconst args = run(\n merge(\n object({\n amount: withDefault(\n option(\"--amount\", \"-n\", integer({ metavar: \"AMOUNT\", min: 1 }), {\n description: message`Amount of scrambles.`,\n }),\n 1,\n ),\n notation: withDefault(\n option(\"--notation\", choice(notationTypes, { metavar: \"NOTATION\" })),\n \"auto\",\n ),\n }),\n object({\n format: withDefault(\n option(\"--format\", \"-f\", choice(outputFormats, { metavar: \"FORMAT\" })),\n \"auto\",\n ),\n }),\n object({\n // TODO: consolidate this with `format`: https://github.com/dahlia/optique/issues/57\n text: map(\n option(\"--text\", \"-t\", {\n description: message`Convenient shorthand for \\`--format text\\`.`,\n }),\n () => \"text\",\n ),\n }),\n object({\n eventID: argument(choice(eventIDs, { metavar: \"EVENT_ID\" }), {\n description: message`WCA or unoffiical event ID.`,\n }),\n }),\n ),\n {\n programName: basename(argv[1]),\n description: message`Example: order 3x3x3 \"R U R' U R U2' R'\"`,\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nconst { amount, format: argsFormat, notation, text, eventID } = args;\nconst format = argsFormat ?? text ?? (!process.stdout.isTTY ? \"text\" : \"auto\");\n\nsetSearchDebug({ logPerf: false, showWorkerInstantiationWarnings: false });\n\nfunction scrambleText(scramble: Alg): string {\n return scramble.toString({\n // TODO: any\n notation: notation as (typeof notationTypes)[number], // TODO: handle type conversion at arg parse time.\n });\n}\n\nfunction scrambleLink(scramble: Alg): string {\n const url = new URL(\"https://alpha.twizzle.net/edit/\");\n const puzzleID = eventInfo(eventID)?.puzzleID;\n puzzleID && url.searchParams.set(\"puzzle\", puzzleID);\n url.searchParams.set(\"alg\", scrambleText(scramble));\n return url.toString();\n}\n\nclass JSONListPrinter<T> {\n #finished = false;\n #firstValuePrintedAlready = false;\n constructor() {\n process.stdout.write(\"[\\n \");\n }\n\n push(value: T) {\n if (this.#firstValuePrintedAlready) {\n process.stdout.write(\",\\n \");\n }\n this.#firstValuePrintedAlready = true;\n process.stdout.write(JSON.stringify(value));\n }\n\n finish() {\n if (this.#finished) {\n throw new Error(\"Tried to finish JSON list printing multiple times.\");\n }\n this.#finished = true;\n console.log(\"\\n]\");\n }\n}\n\n// Possibly: https://github.com/nodejs/node/issues/55468 Technically we could\n// just remove `await` from the called function, but this is semantically\n// unsound. This function encapsulates the unsoundness.\nfunction nodeForgetTopLevelAwaitWorkaround(\n _promise: Promise<void>,\n): Promise<void> {\n return Promise.resolve();\n}\n\nawait nodeForgetTopLevelAwaitWorkaround(\n (async () => {\n if (format !== \"json-text\" && amount === 1) {\n const scramble = await randomScrambleForEvent(eventID);\n\n switch (format) {\n case \"auto\": {\n console.log(`${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}`);\n break;\n }\n case \"text\": {\n console.log(scrambleText(scramble));\n break;\n }\n case \"link\": {\n console.log(scrambleLink(scramble));\n break;\n }\n // @ts-expect-error This is a code guard for future refactoring.\n case \"json-text\": {\n throw new Error(\n \"Encountered `json` format in code that is not expected to handle it.\",\n );\n }\n default: {\n throw new Error(\"Invalid format!\") as never;\n }\n }\n } else {\n const jsonListPrinter: JSONListPrinter<string> | undefined =\n format === \"json-text\" ? new JSONListPrinter() : undefined;\n for (let i = 0; i < amount; i++) {\n const scramble = await randomScrambleForEvent(eventID);\n switch (format) {\n case \"auto\": {\n console.log(`// Scramble #${i + 1}\n${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}\n`);\n break;\n }\n case \"text\": {\n console.log(`// Scramble #${i + 1}`);\n console.log(`${scrambleText(scramble)}\\n`);\n break;\n }\n case \"link\": {\n console.log(`// Scramble #${i + 1}`);\n console.log(`${scrambleLink(scramble)}\\n`);\n break;\n }\n case \"json-text\": {\n jsonListPrinter?.push(scramble.toString());\n break;\n }\n default: {\n throw new Error(\"Invalid format!\") as never;\n }\n }\n }\n jsonListPrinter?.finish();\n }\n })(),\n);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["eventInfo", "eventID"]
|
|
7
|
+
}
|
package/dist/bin/svg.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env -S node --
|
|
2
|
+
import {
|
|
3
|
+
packageVersion
|
|
4
|
+
} from "./chunks/chunk-22VWCGBC.js";
|
|
5
|
+
|
|
6
|
+
// src/bin/svg.ts
|
|
7
|
+
import { basename } from "node:path";
|
|
8
|
+
import { argv } from "node:process";
|
|
9
|
+
import { argument, choice, object, option, withDefault } from "@optique/core";
|
|
10
|
+
import { run } from "@optique/run";
|
|
11
|
+
import { puzzles } from "@rednaxela101/cubing/puzzles";
|
|
12
|
+
var args = run(
|
|
13
|
+
object({
|
|
14
|
+
puzzleID: argument(choice(Object.keys(puzzles), { metavar: "PUZZLE_ID" })),
|
|
15
|
+
visualization: withDefault(
|
|
16
|
+
option(
|
|
17
|
+
"--visualization",
|
|
18
|
+
choice(["2D", "experimental-2D-LL"], { metavar: "PUZZLE_ID" })
|
|
19
|
+
),
|
|
20
|
+
"2D"
|
|
21
|
+
)
|
|
22
|
+
}),
|
|
23
|
+
{
|
|
24
|
+
programName: basename(argv[1]),
|
|
25
|
+
help: "option",
|
|
26
|
+
completion: {
|
|
27
|
+
option: {
|
|
28
|
+
names: ["--completions"],
|
|
29
|
+
hidden: false
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
version: {
|
|
33
|
+
option: {
|
|
34
|
+
hidden: false
|
|
35
|
+
},
|
|
36
|
+
value: packageVersion
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
var puzzleLoader = puzzles[args.puzzleID];
|
|
41
|
+
if (!puzzleLoader) {
|
|
42
|
+
throw new Error(`Invalid puzzle ID: ${args.puzzleID}`);
|
|
43
|
+
}
|
|
44
|
+
switch (args.visualization) {
|
|
45
|
+
case "2D": {
|
|
46
|
+
console.log(await puzzleLoader.svg());
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case "experimental-2D-LL": {
|
|
50
|
+
console.log(await puzzleLoader.llSVG());
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
default:
|
|
54
|
+
throw void 0;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=svg.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/bin/svg.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/svg.ts <program args>\n```\n\nTo add an `svg` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\nsvg --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(svg --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport { argument, choice, object, option, withDefault } from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport { puzzles } from \"@rednaxela101/cubing/puzzles\";\nimport { packageVersion } from \"../metadata/packageVersion\";\n\nconst args = run(\n object({\n puzzleID: argument(choice(Object.keys(puzzles), { metavar: \"PUZZLE_ID\" })),\n visualization: withDefault(\n option(\n \"--visualization\",\n choice([\"2D\", \"experimental-2D-LL\"], { metavar: \"PUZZLE_ID\" }),\n ),\n \"2D\",\n ),\n }),\n {\n programName: basename(argv[1]),\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nconst puzzleLoader = puzzles[args.puzzleID];\nif (!puzzleLoader) {\n throw new Error(`Invalid puzzle ID: ${args.puzzleID}`);\n}\n\nswitch (args.visualization) {\n case \"2D\": {\n console.log(await puzzleLoader.svg());\n break;\n }\n case \"experimental-2D-LL\": {\n console.log(await puzzleLoader.llSVG!());\n break;\n }\n default:\n throw undefined as never;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;AA0BA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,UAAU,QAAQ,QAAQ,QAAQ,mBAAmB;AAC9D,SAAS,WAAW;AACpB,SAAS,eAAe;AAGxB,IAAM,OAAO;AAAA,EACX,OAAO;AAAA,IACL,UAAU,SAAS,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,YAAY,CAAC,CAAC;AAAA,IACzE,eAAe;AAAA,MACb;AAAA,QACE;AAAA,QACA,OAAO,CAAC,MAAM,oBAAoB,GAAG,EAAE,SAAS,YAAY,CAAC;AAAA,MAC/D;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EACD;AAAA,IACE,aAAa,SAAS,KAAK,CAAC,CAAC;AAAA,IAC7B,MAAM;AAAA,IACN,YAAY;AAAA,MACV,QAAQ;AAAA,QACN,OAAO,CAAC,eAAe;AAAA,QACvB,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,QAAQ;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,eAAe,QAAQ,KAAK,QAAQ;AAC1C,IAAI,CAAC,cAAc;AACjB,QAAM,IAAI,MAAM,sBAAsB,KAAK,QAAQ,EAAE;AACvD;AAEA,QAAQ,KAAK,eAAe;AAAA,EAC1B,KAAK,MAAM;AACT,YAAQ,IAAI,MAAM,aAAa,IAAI,CAAC;AACpC;AAAA,EACF;AAAA,EACA,KAAK,sBAAsB;AACzB,YAAQ,IAAI,MAAM,aAAa,MAAO,CAAC;AACvC;AAAA,EACF;AAAA,EACA;AACE,UAAM;AACV;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { At as Move, Ct as AlgLeaf, Dt as Grouping, Et as LineComment, Ft as ExperimentalNotationType, It as ExperimentalSerializationOptions, Mt as QuantumMove, Nt as Conjugate, Ot as GroupingModifications, Pt as Commutator, St as AlgBranch, Tt as Newline, _t as experimentalAppendMove, a as functionFromTraversal, bt as SimplifyOptions, f as Parsed, ft as experimentalIs, gt as Alg, ht as AlgBuilder, i as TraversalUp, jt as MoveModifications, kt as Pause, mt as setAlgDebug, n as experimentalAlgCubingNetLink, o as keyToMove, pt as Example, r as TraversalDownUp, t as AlgCubingNetOptions, vt as AppendCancelOptions, wt as AlgNode, xt as Unit, yt as PuzzleSpecificSimplifyOptions } from "../index-CcRu94bx.js";
|
|
2
|
+
export { Alg, AlgBranch, AlgBuilder, AlgCubingNetOptions, AlgLeaf, AlgNode, AppendCancelOptions, Commutator, Conjugate, Example, ExperimentalNotationType, Parsed as ExperimentalParsed, ExperimentalSerializationOptions, Grouping, GroupingModifications, LineComment, Move, MoveModifications, Newline, Pause, PuzzleSpecificSimplifyOptions, QuantumMove, SimplifyOptions, TraversalDownUp, TraversalUp, Unit, experimentalAlgCubingNetLink, experimentalAppendMove, experimentalIs, functionFromTraversal, keyToMove, setAlgDebug };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Alg,
|
|
3
|
+
AlgBuilder,
|
|
4
|
+
Commutator,
|
|
5
|
+
Conjugate,
|
|
6
|
+
Example,
|
|
7
|
+
Grouping,
|
|
8
|
+
LineComment,
|
|
9
|
+
Move,
|
|
10
|
+
Newline,
|
|
11
|
+
Pause,
|
|
12
|
+
QuantumMove,
|
|
13
|
+
TraversalDownUp,
|
|
14
|
+
TraversalUp,
|
|
15
|
+
experimentalAlgCubingNetLink,
|
|
16
|
+
experimentalAppendMove,
|
|
17
|
+
experimentalIs,
|
|
18
|
+
functionFromTraversal,
|
|
19
|
+
keyToMove,
|
|
20
|
+
setAlgDebug
|
|
21
|
+
} from "../chunks/chunk-XPDJUSZ7.js";
|
|
22
|
+
export {
|
|
23
|
+
Alg,
|
|
24
|
+
AlgBuilder,
|
|
25
|
+
Commutator,
|
|
26
|
+
Conjugate,
|
|
27
|
+
Example,
|
|
28
|
+
Grouping,
|
|
29
|
+
LineComment,
|
|
30
|
+
Move,
|
|
31
|
+
Newline,
|
|
32
|
+
Pause,
|
|
33
|
+
QuantumMove,
|
|
34
|
+
TraversalDownUp,
|
|
35
|
+
TraversalUp,
|
|
36
|
+
experimentalAlgCubingNetLink,
|
|
37
|
+
experimentalAppendMove,
|
|
38
|
+
experimentalIs,
|
|
39
|
+
functionFromTraversal,
|
|
40
|
+
keyToMove,
|
|
41
|
+
setAlgDebug
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/// <reference types="web-bluetooth" />
|
|
2
|
+
|
|
3
|
+
import { At as Move, D as PuzzleID, I as MillisecondTimestamp, R as KPattern, c as PuzzleLoader, gt as Alg, s as KeyMapping } from "../index-CcRu94bx.js";
|
|
4
|
+
import { a as OrientationEvent, i as AlgLeafEvent } from "../index-BX6f56uo.js";
|
|
5
|
+
|
|
6
|
+
//#region src/cubing/bluetooth/debug.d.ts
|
|
7
|
+
declare function enableDebugLogging(enable: boolean): void;
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/cubing/bluetooth/transformer.d.ts
|
|
10
|
+
interface StreamTransformer {
|
|
11
|
+
transformAlgLeaf(algLeafEvent: AlgLeafEvent): void;
|
|
12
|
+
transformOrientation(orientationEvent: OrientationEvent): void;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
//#region src/cubing/bluetooth/smart-puzzle/bluetooth-puzzle.d.ts
|
|
16
|
+
/** @category Smart Puzzles */
|
|
17
|
+
declare abstract class BluetoothPuzzle extends EventTarget {
|
|
18
|
+
transformers: StreamTransformer[];
|
|
19
|
+
protected listeners: Array<(e: AlgLeafEvent) => void>;
|
|
20
|
+
protected orientationListeners: Array<(e: OrientationEvent) => void>;
|
|
21
|
+
abstract name(): string | undefined;
|
|
22
|
+
abstract disconnect(): void;
|
|
23
|
+
getPattern(): Promise<KPattern>;
|
|
24
|
+
addAlgLeafListener(listener: (e: AlgLeafEvent) => void): void;
|
|
25
|
+
addOrientationListener(listener: (e: OrientationEvent) => void): void;
|
|
26
|
+
experimentalAddBasicRotationTransformer(): void;
|
|
27
|
+
protected dispatchAlgLeaf(algLeaf: AlgLeafEvent): void;
|
|
28
|
+
protected dispatchOrientation(orientationEvent: OrientationEvent): void;
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
//#region src/cubing/bluetooth/keyboard.d.ts
|
|
32
|
+
/** @category Keyboard Puzzles */
|
|
33
|
+
declare class KeyboardPuzzle extends BluetoothPuzzle {
|
|
34
|
+
private target;
|
|
35
|
+
private keyMappingAndPatternPromise;
|
|
36
|
+
listener: EventListener;
|
|
37
|
+
constructor(target: Element, puzzle?: PuzzleID | PuzzleLoader);
|
|
38
|
+
name(): string | undefined;
|
|
39
|
+
setPuzzleInternal(puzzle: PuzzleID | PuzzleLoader): Promise<[KeyMapping | undefined, KPattern]>;
|
|
40
|
+
disconnect(): void;
|
|
41
|
+
getPattern(): Promise<KPattern>;
|
|
42
|
+
private onKeyDown;
|
|
43
|
+
}
|
|
44
|
+
/** @category Keyboard Puzzles */
|
|
45
|
+
declare function debugKeyboardConnect(target?: any, puzzle?: PuzzleID | PuzzleLoader): Promise<KeyboardPuzzle>;
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region src/cubing/bluetooth/connect/index.d.ts
|
|
48
|
+
/******** connect() ********/
|
|
49
|
+
interface BluetoothConnectOptions {
|
|
50
|
+
acceptAllDevices?: boolean;
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/cubing/bluetooth/smart-puzzle/connect.d.ts
|
|
54
|
+
/** @category Smart Puzzles */
|
|
55
|
+
declare function connectSmartPuzzle(options?: BluetoothConnectOptions): Promise<BluetoothPuzzle>;
|
|
56
|
+
//#endregion
|
|
57
|
+
//#region src/cubing/bluetooth/smart-puzzle/gan.d.ts
|
|
58
|
+
/** @category Smart Puzzles */
|
|
59
|
+
declare class GanCube extends BluetoothPuzzle {
|
|
60
|
+
private kpuzzle;
|
|
61
|
+
private service;
|
|
62
|
+
private server;
|
|
63
|
+
private physicalStateCharacteristic;
|
|
64
|
+
private lastMoveCounter;
|
|
65
|
+
private aesKey;
|
|
66
|
+
static connect(server: BluetoothRemoteGATTServer): Promise<GanCube>;
|
|
67
|
+
INTERVAL_MS: number;
|
|
68
|
+
private intervalHandle;
|
|
69
|
+
private pattern;
|
|
70
|
+
private cachedFaceletStatus1Characteristic;
|
|
71
|
+
private cachedFaceletStatus2Characteristic;
|
|
72
|
+
private cachedActualAngleAndBatteryCharacteristic;
|
|
73
|
+
private constructor();
|
|
74
|
+
name(): string | undefined;
|
|
75
|
+
disconnect(): void;
|
|
76
|
+
startTrackingMoves(): void;
|
|
77
|
+
stopTrackingMoves(): void;
|
|
78
|
+
intervalHandler(): Promise<void>;
|
|
79
|
+
getBattery(): Promise<number>;
|
|
80
|
+
getPattern(): Promise<KPattern>;
|
|
81
|
+
faceletStatus1Characteristic(): Promise<BluetoothRemoteGATTCharacteristic>;
|
|
82
|
+
faceletStatus2Characteristic(): Promise<BluetoothRemoteGATTCharacteristic>;
|
|
83
|
+
actualAngleAndBatteryCharacteristic(): Promise<BluetoothRemoteGATTCharacteristic>;
|
|
84
|
+
reset(): Promise<void>;
|
|
85
|
+
readFaceletStatus1Characteristic(): Promise<ArrayBufferLike>;
|
|
86
|
+
readFaceletStatus2Characteristic(): Promise<string>;
|
|
87
|
+
readActualAngleAndBatteryCharacteristic(): Promise<ArrayBufferLike>;
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/cubing/bluetooth/smart-puzzle/giiker.d.ts
|
|
91
|
+
/** @category Smart Puzzles */
|
|
92
|
+
declare class GiiKERCube extends BluetoothPuzzle {
|
|
93
|
+
private server;
|
|
94
|
+
private cubeCharacteristic;
|
|
95
|
+
private originalValue?;
|
|
96
|
+
static connect(server: BluetoothRemoteGATTServer): Promise<GiiKERCube>;
|
|
97
|
+
private constructor();
|
|
98
|
+
name(): string | undefined;
|
|
99
|
+
disconnect(): void;
|
|
100
|
+
getPattern(): Promise<KPattern>;
|
|
101
|
+
private getBit;
|
|
102
|
+
private toReid333;
|
|
103
|
+
private onCubeCharacteristicChanged;
|
|
104
|
+
private isRepeatedInitialValue;
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
//#region src/cubing/bluetooth/smart-puzzle/gocube.d.ts
|
|
108
|
+
/** @category Smart Puzzles */
|
|
109
|
+
declare class GoCube extends BluetoothPuzzle {
|
|
110
|
+
private server;
|
|
111
|
+
goCubeStateCharacteristic: BluetoothRemoteGATTCharacteristic;
|
|
112
|
+
static connect(server: BluetoothRemoteGATTServer): Promise<GoCube>;
|
|
113
|
+
private recorded;
|
|
114
|
+
private homeQuatInverse;
|
|
115
|
+
private lastRawQuat;
|
|
116
|
+
private currentQuat;
|
|
117
|
+
private lastTarget;
|
|
118
|
+
private alg;
|
|
119
|
+
private constructor();
|
|
120
|
+
disconnect(): void;
|
|
121
|
+
reset(): void;
|
|
122
|
+
resetAlg(alg?: Alg): void;
|
|
123
|
+
resetOrientation(): void;
|
|
124
|
+
name(): string | undefined;
|
|
125
|
+
private onCubeCharacteristicChanged;
|
|
126
|
+
}
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region src/cubing/bluetooth/smart-robot/GanRobot.d.ts
|
|
129
|
+
interface GanRobotOptions {
|
|
130
|
+
xAngle: boolean;
|
|
131
|
+
singleMoveFixHack: boolean;
|
|
132
|
+
bufferQueue: number;
|
|
133
|
+
postSleep: number;
|
|
134
|
+
}
|
|
135
|
+
/** @category Robots */
|
|
136
|
+
declare class GanRobot extends EventTarget {
|
|
137
|
+
private server;
|
|
138
|
+
private statusCharacteristic;
|
|
139
|
+
private moveCharacteristic;
|
|
140
|
+
experimentalDebugOnSend: ((alg: Alg) => void) | null;
|
|
141
|
+
experimentalDebugLog: typeof console.log;
|
|
142
|
+
experimentalOptions: GanRobotOptions;
|
|
143
|
+
constructor(_service: BluetoothRemoteGATTService, server: BluetoothRemoteGATTServer, device: BluetoothDevice, statusCharacteristic: BluetoothRemoteGATTCharacteristic, moveCharacteristic: BluetoothRemoteGATTCharacteristic);
|
|
144
|
+
static connect(server: BluetoothRemoteGATTServer, device: BluetoothDevice): Promise<GanRobot>;
|
|
145
|
+
name(): string | undefined;
|
|
146
|
+
disconnect(): void;
|
|
147
|
+
onDisconnect(): void;
|
|
148
|
+
private algNodeToNibble;
|
|
149
|
+
private writeNibbles;
|
|
150
|
+
private getStatus;
|
|
151
|
+
locked: boolean;
|
|
152
|
+
processQueue(): void;
|
|
153
|
+
private moveQueue;
|
|
154
|
+
private queueMoves;
|
|
155
|
+
applyMoves(moves: Iterable<Move>): Promise<void>;
|
|
156
|
+
}
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region src/cubing/bluetooth/smart-robot/index.d.ts
|
|
159
|
+
/** @category Robots */
|
|
160
|
+
type BluetoothRobot = GanRobot;
|
|
161
|
+
/** @category Robots */
|
|
162
|
+
declare function connectSmartRobot(options?: BluetoothConnectOptions): Promise<BluetoothRobot>;
|
|
163
|
+
//#endregion
|
|
164
|
+
//#region src/cubing/bluetooth/smart-timer/GanTimer.d.ts
|
|
165
|
+
/** @category Timers */
|
|
166
|
+
declare class GanTimer extends EventTarget {
|
|
167
|
+
private server;
|
|
168
|
+
private timeCharacteristic;
|
|
169
|
+
private polling;
|
|
170
|
+
private previousDetail;
|
|
171
|
+
constructor(_service: BluetoothRemoteGATTService, server: BluetoothRemoteGATTServer, device: BluetoothDevice, timeCharacteristic: BluetoothRemoteGATTCharacteristic);
|
|
172
|
+
static connect(server: BluetoothRemoteGATTServer, device: BluetoothDevice): Promise<GanTimer>;
|
|
173
|
+
disconnect(): void;
|
|
174
|
+
poll(): Promise<void>;
|
|
175
|
+
onDisconnect(): void;
|
|
176
|
+
getTimeCharacteristic(): Promise<Uint8Array<ArrayBufferLike>>;
|
|
177
|
+
getTime(): Promise<MillisecondTimestamp>;
|
|
178
|
+
decodeTimeMs(bytes: Uint8Array): MillisecondTimestamp;
|
|
179
|
+
startPolling(): void;
|
|
180
|
+
stopPolling(): void;
|
|
181
|
+
}
|
|
182
|
+
//#endregion
|
|
183
|
+
//#region src/cubing/bluetooth/smart-timer/index.d.ts
|
|
184
|
+
/** @category Timers */
|
|
185
|
+
type BluetoothTimer = GanTimer;
|
|
186
|
+
/** @category Timers */
|
|
187
|
+
declare function connectSmartTimer(options?: BluetoothConnectOptions): Promise<BluetoothTimer>;
|
|
188
|
+
//#endregion
|
|
189
|
+
export { type BluetoothPuzzle, type BluetoothRobot, type BluetoothTimer, GanCube, GiiKERCube, GoCube, KeyboardPuzzle, type AlgLeafEvent as MoveEvent, type OrientationEvent, connectSmartPuzzle, connectSmartRobot, connectSmartTimer, debugKeyboardConnect, enableDebugLogging };
|