cubing 0.65.0 → 0.65.2
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/dist/bin/chunks/{chunk-NPXQ2ZXZ.js → chunk-Z5QOJAME.js} +3 -3
- package/dist/bin/chunks/chunk-Z5QOJAME.js.map +7 -0
- package/dist/bin/order.js +1 -1
- package/dist/bin/puzzle-geometry-bin.js +1 -1
- package/dist/bin/scramble.js +1 -1
- package/dist/bin/svg.js +1 -1
- package/dist/lib/cubing/alg/index.d.ts +2 -2
- package/dist/lib/cubing/alg/index.js +1 -1
- package/dist/lib/cubing/bluetooth/index.d.ts +25 -26
- package/dist/lib/cubing/bluetooth/index.js +5 -5
- package/dist/lib/cubing/chunks/{big-puzzle-orientation-G75BXW2W.js → big-puzzle-orientation-7WHPJCCO.js} +2 -2
- package/dist/lib/cubing/chunks/{chunk-DTYBGCI3.js → chunk-2BVL5OQE.js} +8 -6
- package/dist/lib/cubing/chunks/chunk-2BVL5OQE.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-KHUP3BPA.js → chunk-2IA2R7XV.js} +4 -4
- package/dist/lib/cubing/chunks/{chunk-5LBACZOM.js → chunk-5FXQPBXH.js} +4 -4
- package/dist/lib/cubing/chunks/{chunk-GO2SL6SC.js → chunk-6K433TB5.js} +3 -3
- package/dist/lib/cubing/chunks/{chunk-THRYJMRP.js → chunk-BQPY6252.js} +2 -2
- package/dist/lib/cubing/chunks/{chunk-O2QJENHE.js → chunk-IRY6MBI2.js} +3 -3
- package/dist/lib/cubing/chunks/{chunk-7MYDNYZ3.js → chunk-MFKLAFPQ.js} +6 -4
- package/dist/lib/cubing/chunks/chunk-MFKLAFPQ.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-UWJ575HH.js → chunk-MIHF623Z.js} +3 -3
- package/dist/lib/cubing/chunks/{chunk-YFNXHRNE.js → chunk-UP5VP7GL.js} +60 -7
- package/dist/lib/cubing/chunks/chunk-UP5VP7GL.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-ALR6ZQFC.js → chunk-YSAQ6DRT.js} +2 -2
- package/dist/lib/cubing/chunks/{inside-A7LIP56H.js → inside-N5WSMI7I.js} +25 -20
- package/dist/lib/cubing/chunks/inside-N5WSMI7I.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-YSB3MWLK.js → search-dynamic-sgs-side-events-5EIXNDVI.js} +6 -6
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-OLK64DE6.js → search-dynamic-sgs-unofficial-Y7SIOVIX.js} +6 -6
- package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-Y7SIOVIX.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-WWFUMIDG.js → search-dynamic-solve-4x4x4-FRAX3IPQ.js} +7 -7
- package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-FRAX3IPQ.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-ZZKLTONP.js → search-dynamic-solve-fto-TI4TFL6X.js} +2 -2
- package/dist/lib/cubing/chunks/search-dynamic-solve-fto-TI4TFL6X.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-PUF4PRHS.js → search-dynamic-solve-kilominx-UKFT6I42.js} +2 -2
- package/dist/lib/cubing/chunks/search-dynamic-solve-kilominx-UKFT6I42.js.map +7 -0
- package/dist/lib/cubing/chunks/search-worker-entry.js +1 -1
- package/dist/lib/cubing/chunks/{twips-LHO3IYJC.js → twips-UCWWA2WI.js} +2 -2
- package/dist/lib/cubing/chunks/{twisty-dynamic-3d-A2G22YLA.js → twisty-dynamic-3d-O5TGOSAO.js} +105 -90
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-O5TGOSAO.js.map +7 -0
- package/dist/lib/cubing/{index-C2x6Sc62.d.ts → index-BQdS3h4z.d.ts} +165 -161
- package/dist/lib/cubing/{index-Doa1gNE4.d.ts → index-COSxNAgV.d.ts} +4 -5
- package/dist/lib/cubing/kpuzzle/index.d.ts +2 -2
- package/dist/lib/cubing/kpuzzle/index.js +2 -2
- package/dist/lib/cubing/notation/index.d.ts +4 -5
- package/dist/lib/cubing/notation/index.js +4 -4
- package/dist/lib/cubing/{outside-nf-4k7Tp.d.ts → outside-BRtF0DA2.d.ts} +12 -9
- package/dist/lib/cubing/protocol/index.d.ts +3 -4
- package/dist/lib/cubing/protocol/index.js +4 -4
- package/dist/lib/cubing/puzzle-geometry/index.d.ts +2 -2
- package/dist/lib/cubing/puzzle-geometry/index.js +1 -1
- package/dist/lib/cubing/puzzles/index.d.ts +2 -2
- package/dist/lib/cubing/puzzles/index.js +4 -4
- package/dist/lib/cubing/scramble/index.d.ts +1 -1
- package/dist/lib/cubing/scramble/index.js +6 -6
- package/dist/lib/cubing/search/index.d.ts +4 -5
- package/dist/lib/cubing/search/index.js +6 -6
- package/dist/lib/cubing/stream/index.d.ts +2 -2
- package/dist/lib/cubing/stream/index.js +1 -1
- package/dist/lib/cubing/twisty/index.d.ts +2 -2
- package/dist/lib/cubing/twisty/index.js +6 -6
- package/package.json +11 -10
- package/dist/bin/chunks/chunk-NPXQ2ZXZ.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-7MYDNYZ3.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-DTYBGCI3.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-YFNXHRNE.js.map +0 -7
- package/dist/lib/cubing/chunks/inside-A7LIP56H.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-OLK64DE6.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-WWFUMIDG.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-solve-fto-ZZKLTONP.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-solve-kilominx-PUF4PRHS.js.map +0 -7
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-A2G22YLA.js.map +0 -7
- /package/dist/lib/cubing/chunks/{big-puzzle-orientation-G75BXW2W.js.map → big-puzzle-orientation-7WHPJCCO.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-KHUP3BPA.js.map → chunk-2IA2R7XV.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-5LBACZOM.js.map → chunk-5FXQPBXH.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-GO2SL6SC.js.map → chunk-6K433TB5.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-THRYJMRP.js.map → chunk-BQPY6252.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-O2QJENHE.js.map → chunk-IRY6MBI2.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-UWJ575HH.js.map → chunk-MIHF623Z.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-ALR6ZQFC.js.map → chunk-YSAQ6DRT.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-YSB3MWLK.js.map → search-dynamic-sgs-side-events-5EIXNDVI.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{twips-LHO3IYJC.js.map → twips-UCWWA2WI.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/search/inside/solve/puzzles/3x3x3/index.ts", "../../../../src/cubing/search/inside/inside-worker.ts", "../../../../src/cubing/search/inside/solve/addOrientationSuffix.ts", "../../../../src/cubing/search/inside/solve/puzzles/dynamic/3x3x3/index.ts", "../../../../src/cubing/search/inside/solve/puzzles/3x3x3/convert.ts", "../../../../src/cubing/search/inside/solve/puzzles/3x3x3/filter.ts", "../../../../src/cubing/search/inside/solve/puzzles/3x3x3/legacy-sgs.ts", "../../../../../../../../../.cache/.bun/install/cache/links/@cubing+comlink-everywhere@0.1.2-aaf32138ec1331d1/node_modules/@cubing/comlink-everywhere/src/comlink.ts", "../../../../../../../../../.cache/.bun/install/cache/links/@cubing+comlink-everywhere@0.1.2-aaf32138ec1331d1/node_modules/@cubing/comlink-everywhere/src/PortableWorker.ts"],
|
|
4
|
-
"sourcesContent": ["import { randomChoice } from \"random-uint-below\";\nimport { Alg } from \"../../../../../alg/index.ts\";\nimport type { KPattern } from \"../../../../../kpuzzle/KPattern.ts\";\nimport { puzzles } from \"../../../../../puzzles/index.ts\";\nimport { mustBeInsideWorker } from \"../../../inside-worker.ts\";\nimport { addOrientationSuffix } from \"../../addOrientationSuffix.ts\";\nimport { dynamic3x3x3min2phase } from \"../dynamic/3x3x3/index.ts\";\nimport { toMin2PhasePattern } from \"./convert.ts\";\nimport { passesFilter } from \"./filter.ts\";\nimport { sgs3x3x3 } from \"./legacy-sgs.ts\";\n\nexport async function random333Pattern(): Promise<KPattern> {\n const kpuzzle = await puzzles[\"3x3x3\"].kpuzzle();\n let pattern = kpuzzle.defaultPattern();\n for (const piece of sgs3x3x3) {\n pattern = pattern.applyAlg(Alg.fromString(randomChoice(piece)));\n }\n if (!passesFilter(kpuzzle, pattern)) {\n return random333Pattern();\n }\n return pattern;\n}\n\nexport async function solve333(s: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n return Alg.fromString(\n (await dynamic3x3x3min2phase).solvePattern(toMin2PhasePattern(s)),\n );\n}\n\nexport async function random333Scramble(): Promise<Alg> {\n return solve333(await random333Pattern());\n}\n\nexport async function initialize333(): Promise<void> {\n (await dynamic3x3x3min2phase).initialize();\n}\n\nconst randomSuffixes = [\n [null, \"Rw\", \"Rw2\", \"Rw'\", \"Fw\", \"Fw'\"],\n [null, \"Dw\", \"Dw2\", \"Dw'\"],\n];\n\nexport async function random333OrientedScramble(): Promise<Alg> {\n return addOrientationSuffix(await random333Scramble(), randomSuffixes);\n}\n", "let isInsideWorker = false;\n\nexport function setIsInsideWorker(inside: boolean) {\n isInsideWorker = inside;\n}\n\nexport function mustBeInsideWorker(): void {\n if (!isInsideWorker) {\n throw new Error(\n \"Must be called from inside a worker, to avoid impact on page performance. Try importing from the top level of `cubing/solve`?\",\n );\n }\n}\n", "import { randomChoice } from \"random-uint-below\";\nimport { type Alg, AlgBuilder, Move } from \"../../../alg/index.ts\";\n\nexport function addOrientationSuffix(\n alg: Alg,\n suffixSpec: (null | string)[][],\n): Alg {\n const algBuilder = new AlgBuilder();\n algBuilder.experimentalPushAlg(alg);\n for (const suffix of suffixSpec) {\n const choice = randomChoice(suffix);\n if (choice !== null) {\n algBuilder.push(Move.fromString(choice));\n }\n }\n return algBuilder.toAlg();\n}\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\n\nexport const dynamic3x3x3min2phase = new LazyPromise(\n () => import(\"./search-dynamic-solve-3x3x3.ts\"),\n);\n", "/*\n\nFace order:\n\n U\nLFRB\n D\n\n | 0| 1| 2|\n | 3| 4| 5|\n | 6| 7| 8|\n| 9|10|11|18|19|20|27|28|29|36|37|38|\n|12|13|14|21|22|23|30|31|32|39|40|41|\n|15|16|17|24|25|26|33|34|35|42|43|44|\n |45|46|47|\n |48|49|50|\n |51|52|53|\n*/\n\nimport type { KPattern } from \"../../../../../kpuzzle/KPattern.ts\";\n\nconst reidEdgeOrder = \"UF UR UB UL DF DR DB DL FR FL BR BL\".split(\" \");\nconst reidCornerOrder = \"UFR URB UBL ULF DRF DFL DLB DBR\".split(\" \");\nconst centerOrder = \"U L F R B D\".split(\" \");\n\n// const stickers = [reidEdgeOrder, reidCornerOrder, centerOrder];\n\n// /*\n// |1 20|0 20|1 10|\n// |0 30|2 00|0 10|\n// |1 30|0 00|1 00|\n// |1 22|0 31|1 31|1 32|0 01|1 01|1 02|0 11|1 11|1 12|0 21|1 21|\n// |0111|2 10|0 91|0 90|2 20|0 80|0 81|2 30|0101|0100|2 40|0110|\n// |1 61|0 71|1 52|1 51|0 41|1 42|1 41|0 51|1 72|1 71|0 61|1 62|\n// |1 50|0 40|1 40|\n// |0 70|2 50|0 50|\n// |1 60|0 60|1 70|\n// */\n\nconst map: [number, number, number][] = [\n [1, 2, 0],\n [0, 2, 0],\n [1, 1, 0],\n [0, 3, 0],\n [2, 0, 0],\n [0, 1, 0],\n [1, 3, 0],\n [0, 0, 0],\n [1, 0, 0],\n [1, 0, 2],\n [0, 1, 1],\n [1, 1, 1],\n [0, 8, 1],\n [2, 3, 0],\n [0, 10, 1],\n [1, 4, 1],\n [0, 5, 1],\n [1, 7, 2],\n [1, 3, 2],\n [0, 0, 1],\n [1, 0, 1],\n [0, 9, 0],\n [2, 2, 0],\n [0, 8, 0],\n [1, 5, 1],\n [0, 4, 1],\n [1, 4, 2],\n [1, 5, 0],\n [0, 4, 0],\n [1, 4, 0],\n [0, 7, 0],\n [2, 5, 0],\n [0, 5, 0],\n [1, 6, 0],\n [0, 6, 0],\n [1, 7, 0],\n [1, 2, 2],\n [0, 3, 1],\n [1, 3, 1],\n [0, 11, 1],\n [2, 1, 0],\n [0, 9, 1],\n [1, 6, 1],\n [0, 7, 1],\n [1, 5, 2],\n [1, 1, 2],\n [0, 2, 1],\n [1, 2, 1],\n [0, 10, 0],\n [2, 4, 0],\n [0, 11, 0],\n [1, 7, 1],\n [0, 6, 1],\n [1, 6, 2],\n];\n\nfunction rotateLeft(s: string, i: number): string {\n return s.slice(i) + s.slice(0, i);\n}\n\nfunction toReid333Struct(pattern: KPattern): string[][] {\n const output: string[][] = [[], []];\n for (let i = 0; i < 6; i++) {\n if (pattern.patternData[\"CENTERS\"].pieces[i] !== i) {\n throw new Error(\"non-oriented puzzles are not supported\");\n }\n }\n for (let i = 0; i < 12; i++) {\n output[0].push(\n rotateLeft(\n reidEdgeOrder[pattern.patternData[\"EDGES\"].pieces[i]],\n pattern.patternData[\"EDGES\"].orientation[i],\n ),\n );\n }\n for (let i = 0; i < 8; i++) {\n output[1].push(\n rotateLeft(\n reidCornerOrder[pattern.patternData[\"CORNERS\"].pieces[i]],\n pattern.patternData[\"CORNERS\"].orientation[i],\n ),\n );\n }\n output.push(centerOrder);\n return output;\n}\n\n// function toReid333String(state: Transformation): string {\n// return toReid333Struct(state)\n// .map((l) => l.join(\" \"))\n// .join(\" \");\n// }\n\nexport function toMin2PhasePattern(pattern: KPattern): string {\n const reid = toReid333Struct(pattern);\n return map.map(([orbit, perm, ori]) => reid[orbit][perm][ori]).join(\"\");\n}\n", "import { Move } from \"../../../../../alg/index.ts\";\nimport type { KPuzzle } from \"../../../../../kpuzzle/index.ts\";\nimport { KPattern } from \"../../../../../kpuzzle/index.ts\";\n\nexport function isEquivalentTranformationIgnoringCENTERS(\n t1: KPattern,\n t2: KPattern,\n): boolean {\n const t1NoCenterOri = new KPattern(t1.kpuzzle, {\n EDGES: t1.patternData[\"EDGES\"],\n CORNERS: t1.patternData[\"CORNERS\"],\n CENTERS: {\n pieces: t1.patternData[\"CENTERS\"].pieces,\n orientation: new Array(6).fill(0),\n },\n }).experimentalToTransformation()!;\n const t2NoCenterOri = new KPattern(t2.kpuzzle, {\n EDGES: t2.patternData[\"EDGES\"],\n CORNERS: t2.patternData[\"CORNERS\"],\n CENTERS: {\n pieces: t2.patternData[\"CENTERS\"].pieces,\n orientation: new Array(6).fill(0),\n },\n }).experimentalToTransformation()!;\n return t1NoCenterOri.isIdentical(t2NoCenterOri);\n}\n\nexport function passesFilter(kpuzzle: KPuzzle, pattern: KPattern): boolean {\n if (\n isEquivalentTranformationIgnoringCENTERS(kpuzzle.defaultPattern(), pattern)\n ) {\n return false;\n }\n\n for (const face of \"ULFRBD\") {\n for (let amount = 1; amount < 4; amount++) {\n const transformation = kpuzzle\n .moveToTransformation(new Move(face, amount))\n .toKPattern();\n if (isEquivalentTranformationIgnoringCENTERS(transformation, pattern)) {\n return false;\n }\n }\n }\n\n return true;\n}\n// TODO: implement tests\n// {\n// const def = await puzzles[\"3x3x3\"].def();\n// const kpuzzle = new KPuzzle(def);\n// console.log(passesFilter(def, kpuzzle.state));\n// kpuzzle.applyAlg(parse(\"R\"));\n// console.log(passesFilter(def, kpuzzle.state));\n// kpuzzle.applyAlg(parse(\"D\"));\n// console.log(passesFilter(def, kpuzzle.state));\n// kpuzzle.reset();\n// kpuzzle.applyAlg(parse(\"(R' U' R U')5\"));\n// console.log(passesFilter(def, kpuzzle.state));\n// }\n", "// TODO: Verify\nexport const sgs3x3x3: string[][] = [\n [\n \"R U'\",\n \"R2 B\", //\n \"D2 B2\",\n \"D' L B'\", //\n \"R' U'\",\n \"B\", //\n \"D B2\",\n \"R' B\", //\n \"L' U\",\n \"L2 B'\", //\n \"B2\",\n \"D L B'\", //\n \"L U\",\n \"B'\", //\n \"U'\",\n \"R B\", //\n \"D' B2\",\n \"L B'\", //\n \"U2\",\n \"U L' B'\", //\n \"\",\n \"U' L' B'\", //\n \"U\",\n \"L' B'\",\n ],\n [\n \"F2 L2\",\n \"F' L'\",\n \"R' F L2\", //\n \"D' L2\",\n \"F L2\",\n \"F2 L'\", //\n \"R' F' L'\",\n \"R2 F L2\",\n \"R2 F2 L'\", //\n \"L2\",\n \"F L'\",\n \"D' L\", //\n \"D2 L2\",\n \"R2 F' L'\",\n \"D L\", //\n \"\",\n \"L2 F L'\",\n \"L F' L2\", //\n \"L F L'\",\n \"F' L2\",\n \"L'\", //\n \"D L2\",\n \"D F L'\",\n \"L\",\n ],\n [\n \"R B U2 B'\",\n \"R2 B U' B'\", //\n \"F2 B U B'\",\n \"F B2 L' B2\", //\n \"B2 L B2\",\n \"B U' B'\", //\n \"R2 B U2 B'\",\n \"R' B U' B'\", //\n \"B2 L' B2\",\n \"F B U B'\", //\n \"B2 U' B2\",\n \"B' L B\", //\n \"L F' B D' B'\",\n \"B' U' B2 D B'\", //\n \"B U2 B'\",\n \"R B U' B'\", //\n \"B2 L2 B2\",\n \"D' B' L B\", //\n \"B U B'\",\n \"F' B2 L' B2\", //\n \"\",\n \"B2 L' B' U' B'\",\n ],\n [\n \"U F2 L2 U'\",\n \"F' U L' U'\", //\n \"F2 U L' U'\",\n \"U F L2 U'\", //\n \"U2 B2 U2\",\n \"R' U' B U\", //\n \"D2 U L U'\",\n \"D U2 B' U2\", //\n \"U L2 U'\",\n \"F U L' U'\", //\n \"D U L U'\",\n \"U2 B' U2\", //\n \"\",\n \"U2 B' U' L' U'\", //\n \"U2 L' U2\",\n \"U' B U\", //\n \"U L U'\",\n \"D' U2 B' U2\", //\n \"U L' U'\",\n \"U2 B U2\",\n ],\n [\n \"R' D' F2\",\n \"F'\", //\n \"F2\",\n \"D R F'\", //\n \"R D' F2\",\n \"R2 F'\", //\n \"D' F2\",\n \"R F'\", //\n \"F2 R' D' F2\",\n \"F\", //\n \"D2 F2\",\n \"D' R F'\", //\n \"R2 D' F2\",\n \"R' F'\", //\n \"D F2\",\n \"D2 R F'\", //\n \"\",\n \"F R' D' F2\",\n ],\n [\n \"R' D2 F' D F\",\n \"R F2 R2 F2\",\n \"R2 F' D2 F\", //\n \"F' R2 D2 F\",\n \"L D' L'\",\n \"D F' D2 F\", //\n \"F2 R2 F2\",\n \"R F' D2 F\",\n \"F' R2 D' F\", //\n \"F' R' D2 F\",\n \"F2 R' F2\",\n \"L D L'\", //\n \"F' R D' F\",\n \"F2 R F2\",\n \"F' D2 F\", //\n \"\",\n \"L D2 R D' L'\",\n \"F' D2 F' R F2\", //\n \"D2 R2 F2 R2 F2\",\n \"D F' D' F\",\n \"F' D F\",\n ],\n [\n \"U F2 U'\",\n \"R U F' U'\", //\n \"D R U F2 U'\",\n \"U F U'\", //\n \"R2 U F2 U'\",\n \"R' U F' U'\", //\n \"R U F2 U'\",\n \"R2 U F' U'\", //\n \"\",\n \"U L D L' F U'\", //\n \"F2 D' R D F2\",\n \"D2 U F U'\", //\n \"R' U F2 U'\",\n \"U F' U'\", //\n \"F2 D2 R D2 F2\",\n \"D U F U'\",\n ],\n [\n \"R2\",\n \"R' B' D B\", //\n \"D R'\",\n \"F' R2 F\", //\n \"\",\n \"R B' D B\", //\n \"R'\",\n \"B' D B\", //\n \"D' R'\",\n \"D2 F' R2 F\", //\n \"R\",\n \"R2 B' D B\", //\n \"D2 R'\",\n \"B' D' B\",\n ],\n [\n \"R2 D' R2\",\n \"F' R' F R\",\n \"R D' R2 D R'\", //\n \"D2 R2 D2 R2\",\n \"R' D' F' R F\",\n \"U F D F' U'\", //\n \"\",\n \"R2 D2 B R' B' R'\",\n \"R' F D' F2 R F\", //\n \"R2 D R2\",\n \"F2 U F U' F\",\n \"R' D F' R F\", //\n \"D R2 D2 R2\",\n \"U F D' F' U'\",\n \"D R' D2 F' R F\", //\n \"R2 D2 R2\",\n \"U F D2 F' U'\",\n \"R' D2 F' R F\",\n ],\n [\n \"B R B'\",\n \"F D F' B R2 B'\", //\n \"D B R2 B'\",\n \"D2 B R' B'\", //\n \"B R2 B'\",\n \"D B R' B'\", //\n \"D' B R2 B'\",\n \"B R' B'\", //\n \"\",\n \"B R2 B' D B R' B'\", //\n \"D2 B R2 B'\",\n \"D' B R' B'\",\n ],\n [\n \"\",\n \"R' D R F D2 F'\", //\n \"R' D R\",\n \"D F D' F'\", //\n \"R F' R' F\",\n \"F D' F'\", //\n \"R' D' R\",\n \"F D2 F'\", //\n \"R' D2 R\",\n \"F D F'\",\n ],\n [\n \"\",\n \"F2 D2 R F' R' D2 F' D2 F'\",\n \"F2 D2 F' D' F D' F' D2 F'\", //\n \"F2 D F2 D F2 D2 F2\",\n \"D2 F L D2 L' D2 F'\",\n \"D F D2 L D2 L' F'\", //\n \"R' D B' D2 B D' R\",\n \"R' D2 B' D2 B R\",\n \"F D2 F' D F D F'\", //\n \"F D' L D2 L' D F'\",\n \"B D' F D B' D' F'\",\n \"F D2 L D2 L' F'\", //\n \"F D' L D L' D F'\",\n \"F L D2 L' D2 F'\",\n \"R' B' D2 B D2 R\",\n ],\n [\n \"D'\",\n \"F L D L' D' F'\", //\n \"D2\",\n \"L B D B' D' L'\", //\n \"D\",\n \"B' L' D' L D B\", //\n \"\",\n \"D F L D L' D' F'\",\n ],\n [\n \"F' D2 F D F' D F\",\n \"F' D' R' D R F\", //\n \"F' R' D' R D F\",\n \"B D R D' R' B'\", //\n \"\",\n \"D B' D' L' D L B\",\n ],\n [\n \"D F D F' D F D2 F'\",\n \"F' U2 B' R' B U2 F' L F' L' F'\", //\n \"\",\n \"D2 L D L2 F L F2 D F\",\n ],\n [\n \"L B' L' F L B L' F'\",\n \"F2 U F' D2 F U' F' D2 F'\",\n \"D' F' D B D' F D B'\", //\n \"F L2 F R2 F' L2 F R2 F2\",\n \"D B D' F' D B' D' F\",\n \"R F L F' R' F L' F'\", //\n \"\",\n \"D2 B L' U2 L B' D2 B L' U2 L B'\",\n \"D2 F R' U2 R F' D2 F R' U2 R F'\", //\n \"R F L' F' R' F L F'\",\n \"D F D' B' D F' D' B\",\n \"L2 F2 L' B2 L F2 L' B2 L'\",\n ],\n [\n \"L B R' B' L' B R B'\",\n \"R' B R F' R' B' R F\",\n \"L D2 L U L' D2 L U' L2\", //\n \"\",\n \"D2 B' D2 F D' L2 F L2 F' D2 B D' F'\",\n \"D2 F' R' F R2 B' D2 B D2 R' F D2 F'\", //\n \"L B L' F L B' L' F'\",\n \"F' D2 F' U' F D2 F' U F2\",\n \"D' B' D F D' B D F'\",\n ],\n [\"\", \"D2 F' L U2 L' F D2 F' L U2 L' F\", \"D2 B' R U2 R' B D2 B' R U2 R' B\"],\n];\n", "/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n type Endpoint,\n type EventSource,\n type Message,\n MessageType,\n type PostMessageWithOrigin,\n type WireValue,\n WireValueType,\n} from \"./protocol\";\nexport type { Endpoint };\n\nexport const proxyMarker = Symbol(\"Comlink.proxy\");\nexport const createEndpoint = Symbol(\"Comlink.endpoint\");\nexport const releaseProxy = Symbol(\"Comlink.releaseProxy\");\nexport const finalizer = Symbol(\"Comlink.finalizer\");\n\nconst throwMarker = Symbol(\"Comlink.thrown\");\n\nconst REF_COUNT_BY_DEFAULT = true;\n\n// biome-ignore lint/suspicious/noExplicitAny: The API often requires us to effectively use `any`. This indicates \"we really have no type for this\".\nexport type Any = any;\n\n/**\n * Interface of values that were marked to be proxied with `comlink.proxy()`.\n * Can also be implemented by classes.\n */\nexport interface ProxyMarked {\n [proxyMarker]: true;\n}\n\n/**\n * Takes a type and wraps it in a Promise, if it not already is one.\n * This is to avoid `Promise<Promise<T>>`.\n *\n * This is the inverse of `Unpromisify<T>`.\n */\ntype Promisify<T> = T extends Promise<unknown> ? T : Promise<T>;\n/**\n * Takes a type that may be Promise and unwraps the Promise type.\n * If `P` is not a Promise, it returns `P`.\n *\n * This is the inverse of `Promisify<T>`.\n */\ntype Unpromisify<P> = P extends Promise<infer T> ? T : P;\n\n/**\n * Takes the raw type of a remote property and returns the type that is visible to the local thread on the proxy.\n *\n * Note: This needs to be its own type alias, otherwise it will not distribute over unions.\n * See https://www.typescriptlang.org/docs/handbook/advanced-types.html#distributive-conditional-types\n */\ntype RemoteProperty<T> =\n // If the value is a method, comlink will proxy it automatically.\n // Objects are only proxied if they are marked to be proxied.\n // Otherwise, the property is converted to a Promise that resolves the cloned value.\n // biome-ignore lint/complexity/noBannedTypes: This is a very general type.\n T extends Function | ProxyMarked ? Remote<T> : Promisify<T>;\n\n/**\n * Takes the raw type of a property as a remote thread would see it through a proxy (e.g. when passed in as a function\n * argument) and returns the type that the local thread has to supply.\n *\n * This is the inverse of `RemoteProperty<T>`.\n *\n * Note: This needs to be its own type alias, otherwise it will not distribute over unions. See\n * https://www.typescriptlang.org/docs/handbook/advanced-types.html#distributive-conditional-types\n */\n// biome-ignore lint/complexity/noBannedTypes: This is a very general type.\ntype LocalProperty<T> = T extends Function | ProxyMarked\n ? Local<T>\n : Unpromisify<T>;\n\n/**\n * Proxies `T` if it is a `ProxyMarked`, clones it otherwise (as handled by structured cloning and transfer handlers).\n */\nexport type ProxyOrClone<T> = T extends ProxyMarked ? Remote<T> : T;\n/**\n * Inverse of `ProxyOrClone<T>`.\n */\nexport type UnproxyOrClone<T> =\n T extends RemoteObject<ProxyMarked> ? Local<T> : T;\n\n/**\n * Takes the raw type of a remote object in the other thread and returns the type as it is visible to the local thread\n * when proxied with `Comlink.proxy()`.\n *\n * This does not handle call signatures, which is handled by the more general `Remote<T>` type.\n *\n * @template T The raw type of a remote object as seen in the other thread.\n */\nexport type RemoteObject<T> = { [P in keyof T]: RemoteProperty<T[P]> };\n/**\n * Takes the type of an object as a remote thread would see it through a proxy (e.g. when passed in as a function\n * argument) and returns the type that the local thread has to supply.\n *\n * This does not handle call signatures, which is handled by the more general `Local<T>` type.\n *\n * This is the inverse of `RemoteObject<T>`.\n *\n * @template T The type of a proxied object.\n */\nexport type LocalObject<T> = { [P in keyof T]: LocalProperty<T[P]> };\n\n/**\n * Additional special comlink methods available on each proxy returned by `Comlink.wrap()`.\n */\nexport interface ProxyMethods {\n [createEndpoint]: () => Promise<MessagePort>;\n [releaseProxy]: () => void;\n}\n\n/**\n * Takes the raw type of a remote object, function or class in the other thread and returns the type as it is visible to\n * the local thread from the proxy return value of `Comlink.wrap()` or `Comlink.proxy()`.\n */\nexport type Remote<T> =\n // Handle properties\n RemoteObject<T> &\n // Handle call signature (if present)\n (T extends (...args: infer TArguments) => infer TReturn\n ? (\n ...args: { [I in keyof TArguments]: UnproxyOrClone<TArguments[I]> }\n ) => Promisify<ProxyOrClone<Unpromisify<TReturn>>>\n : unknown) &\n // Handle construct signature (if present)\n // The return of construct signatures is always proxied (whether marked or not)\n (T extends { new (...args: infer TArguments): infer TInstance }\n ? {\n new (\n ...args: {\n [I in keyof TArguments]: UnproxyOrClone<TArguments[I]>;\n }\n ): Promisify<Remote<TInstance>>;\n }\n : unknown) &\n // Include additional special comlink methods available on the proxy.\n ProxyMethods;\n\n/**\n * Expresses that a type can be either a sync or async.\n */\ntype MaybePromise<T> = Promise<T> | T;\n\n/**\n * Takes the raw type of a remote object, function or class as a remote thread would see it through a proxy (e.g. when\n * passed in as a function argument) and returns the type the local thread has to supply.\n *\n * This is the inverse of `Remote<T>`. It takes a `Remote<T>` and returns its original input `T`.\n */\nexport type Local<T> =\n // Omit the special proxy methods (they don't need to be supplied, comlink adds them)\n Omit<LocalObject<T>, keyof ProxyMethods> &\n // Handle call signatures (if present)\n (T extends (...args: infer TArguments) => infer TReturn\n ? (\n ...args: { [I in keyof TArguments]: ProxyOrClone<TArguments[I]> }\n ) => MaybePromise<UnproxyOrClone<Unpromisify<TReturn>>> // The raw function could either be sync or async, but is always proxied automatically\n : unknown) &\n // Handle construct signature (if present)\n // The return of construct signatures is always proxied (whether marked or not)\n (T extends { new (...args: infer TArguments): infer TInstance }\n ? {\n new (\n ...args: {\n [I in keyof TArguments]: ProxyOrClone<TArguments[I]>;\n }\n ): // The raw constructor could either be sync or async, but is always proxied automatically\n MaybePromise<Local<Unpromisify<TInstance>>>;\n }\n : unknown);\n\nconst isObject = (val: unknown): val is object =>\n (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n\n/**\n * Customizes the serialization of certain values as determined by `canHandle()`.\n *\n * @template T The input type being handled by this transfer handler.\n * @template S The serialized type sent over the wire.\n */\nexport interface TransferHandler<T, S> {\n /**\n * Gets called for every value to determine whether this transfer handler\n * should serialize the value, which includes checking that it is of the right\n * type (but can perform checks beyond that as well).\n */\n canHandle(value: unknown): value is T;\n\n /**\n * Gets called with the value if `canHandle()` returned `true` to produce a\n * value that can be sent in a message, consisting of structured-cloneable\n * values and/or transferrable objects.\n */\n serialize(value: T): [S, Transferable[]];\n\n /**\n * Gets called to deserialize an incoming value that was serialized in the\n * other thread with this transfer handler (known through the name it was\n * registered under).\n */\n deserialize(value: S): T;\n}\n\n/**\n * Internal transfer handle to handle objects marked to proxy.\n */\nconst proxyTransferHandler: TransferHandler<object, MessagePort> = {\n canHandle: (val): val is ProxyMarked =>\n isObject(val) && (val as ProxyMarked)[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n};\n\ninterface ThrownValue {\n [throwMarker]: unknown; // just needs to be present\n value: unknown;\n}\ntype SerializedThrownValue =\n | { isError: true; value: Error }\n | { isError: false; value: unknown };\ntype PendingListenersMap = Map<\n string,\n (value: WireValue | PromiseLike<WireValue>) => void\n>;\ntype EndpointWithPendingListeners = {\n endpoint: Endpoint;\n pendingListeners: PendingListenersMap;\n};\n\n/**\n * Internal transfer handler to handle thrown exceptions.\n */\nconst throwTransferHandler: TransferHandler<\n ThrownValue,\n SerializedThrownValue\n> = {\n canHandle: (value): value is ThrownValue =>\n isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized: SerializedThrownValue;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n } else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(\n new Error(serialized.value.message),\n serialized.value,\n );\n }\n throw serialized.value;\n },\n};\n\n/**\n * Allows customizing the serialization of certain values.\n */\nexport const transferHandlers = new Map<\n string,\n TransferHandler<unknown, unknown>\n>([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n]);\n\nexport interface NodeEndpoint {\n postMessage(message: Any, transfer?: Any[]): void;\n on(type: string, listener: EventListenerOrEventListenerObject): void;\n off(type: string, listener: EventListenerOrEventListenerObject): void;\n ref?: () => void;\n unref?: () => void;\n start?: () => void;\n terminate?: () => void;\n close?: () => void;\n}\n\nexport function nodeEndpoint(rawEndpoint: NodeEndpoint): Endpoint {\n const listeners: {\n [event: string]:\n | WeakMap<EventListenerOrEventListenerObject, Any>\n | undefined;\n } = {};\n function removeEventListener(\n event: \"message\",\n eh: EventListenerOrEventListenerObject,\n ) {\n const l = listeners[event]?.get(eh);\n if (!l) {\n return;\n }\n rawEndpoint.off(event, l);\n listeners[event]?.delete(eh);\n }\n\n return {\n postMessage: rawEndpoint.postMessage.bind(rawEndpoint),\n addEventListener: (\n event: \"message\",\n handler,\n options?: { once: boolean },\n ) => {\n const listener = (data: Any) => {\n if (options?.once) {\n removeEventListener(event, listener);\n }\n if (\"handleEvent\" in handler) {\n handler.handleEvent({ data } as MessageEvent);\n } else {\n handler({ data } as MessageEvent);\n }\n };\n rawEndpoint.on(event, listener);\n (listeners[event] ?? new WeakMap()).set(handler, listener);\n },\n removeEventListener,\n // In theory, `node` exposes these on `Symbol.for('nodejs.ref') ` and\n // `Symbol.for('nodejs.unref') ` fields. In practice, this is not supported across all runtimes.\n ref: rawEndpoint.ref?.bind(rawEndpoint),\n unref: rawEndpoint.unref?.bind(rawEndpoint),\n start: (rawEndpoint as { start?: () => void }).start?.bind(rawEndpoint),\n terminate: (rawEndpoint as { terminate?: () => void }).terminate?.bind(\n rawEndpoint,\n ),\n close: (rawEndpoint as { close?: () => void }).close?.bind(rawEndpoint),\n };\n}\n\nfunction toEndpoint(endpoint: Endpoint | NodeEndpoint): Endpoint {\n if (\n !(\"addEventListener\" in endpoint) ||\n !(\"removeEventListener\" in endpoint)\n ) {\n return nodeEndpoint(endpoint);\n }\n return endpoint;\n}\n\nfunction isAllowedOrigin(\n allowedOrigins: (string | RegExp)[],\n origin: string,\n): boolean {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n}\n\nfunction defaultExposeEndpoint() {\n return (\n globalThis.process?.getBuiltinModule(\"node:worker_threads\").parentPort ??\n (globalThis as Endpoint)\n );\n}\n\nexport function expose(\n obj: Any,\n endpoint: Endpoint | NodeEndpoint = defaultExposeEndpoint(),\n allowedOrigins: (string | RegExp)[] = [\"*\"],\n) {\n const ep = toEndpoint(endpoint);\n ep.addEventListener(\"message\", function callback(ev: MessageEvent) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = {\n path: [] as string[],\n ...(ev.data as Message),\n };\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue: Any;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case MessageType.GET:\n {\n returnValue = rawValue;\n }\n break;\n case MessageType.SET:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case MessageType.APPLY:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case MessageType.CONSTRUCT:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case MessageType.ENDPOINT:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case MessageType.RELEASE:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n } catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n // TODO: `Promise.try`?\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage({ ...wireValue, id }, transferables);\n if (type === MessageType.RELEASE) {\n // detach and deactivate after sending release response above.\n ep.removeEventListener(\"message\", callback as Any);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((_error) => {\n console.log(_error);\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage({ ...wireValue, id }, transferables);\n });\n } as Any);\n ep.start?.();\n}\n\nfunction closeEndPoint(endpoint: Endpoint) {\n endpoint.close?.();\n endpoint.terminate?.();\n}\n\n/**\n * In certain runtimes like `node`, communicating with a worker will effectively\n * call `.ref()` on (i.e.\"reference\") the worker, which means that the worker\n * will keep the process from terminating by default (similar to an unresolved\n * `Promise`). It is possible to call `.unref()` on a worker to prevent this,\n * but that may allows process to exit before all the intended work is\n * completed.\n *\n * When wrapping a `node` worker, `comlink` now automatically tracks wrapped\n * calls, and calls `.unref()` on the worker whenever there are no more pending\n * calls. This is usually what you want if you are using the the worker\n * specifically for a wrapped API and nothing else. If you need manually manage\n * the worker or pass messages outside of `comlink`, pass `{ refCount: false }`\n * for `options` to disable this behaviour. Note that this makes no difference\n * for workers in web browsers.\n */\nexport function wrap<T>(\n endpoint: Endpoint | NodeEndpoint,\n target?: Any,\n options?: { refCount: boolean },\n): Remote<T> {\n const ep = toEndpoint(endpoint);\n const pendingListeners: PendingListenersMap = new Map();\n\n ep.addEventListener(\"message\", function handleMessage(ev: Event) {\n const { data } = ev as MessageEvent;\n if (!data || !data.id) {\n return;\n }\n const resolver = pendingListeners.get(data.id);\n if (!resolver) {\n return;\n }\n\n try {\n resolver(data);\n } finally {\n pendingListeners.delete(data.id);\n if (\n pendingListeners.size === 0 &&\n (options?.refCount ?? REF_COUNT_BY_DEFAULT)\n ) {\n ep.unref?.();\n }\n }\n });\n\n return createProxy<T>({ endpoint: ep, pendingListeners }, [], target) as Any;\n}\n\nfunction throwIfProxyReleased(isReleased: boolean) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\n\nfunction releaseEndpoint(epWithPendingListeners: EndpointWithPendingListeners) {\n return requestResponseMessage(epWithPendingListeners, {\n type: MessageType.RELEASE,\n }).then(() => {\n closeEndPoint(epWithPendingListeners.endpoint);\n });\n}\n\nconst proxyCounter = new WeakMap<EndpointWithPendingListeners, number>();\nconst proxyFinalizers =\n \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry(\n (epWithPendingListeners: EndpointWithPendingListeners) => {\n const newCount = (proxyCounter.get(epWithPendingListeners) || 0) - 1;\n proxyCounter.set(epWithPendingListeners, newCount);\n if (newCount === 0) {\n void releaseEndpoint(epWithPendingListeners).finally(() => {\n epWithPendingListeners.pendingListeners.clear();\n });\n }\n },\n );\n\nfunction registerProxy(\n proxy: object,\n epWithPendingListeners: EndpointWithPendingListeners,\n) {\n const newCount = (proxyCounter.get(epWithPendingListeners) || 0) + 1;\n proxyCounter.set(epWithPendingListeners, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, epWithPendingListeners, proxy);\n }\n}\n\nfunction unregisterProxy(proxy: object) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n}\n\nfunction createProxy<T>(\n epWithPendingListeners: EndpointWithPendingListeners,\n path: (string | number | symbol)[] = [],\n target: object = () => {},\n): Remote<T> {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n void releaseEndpoint(epWithPendingListeners).finally(() => {\n epWithPendingListeners.pendingListeners.clear();\n });\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n // biome-ignore lint/suspicious/noThenProperty: TODO\n return { then: () => proxy };\n }\n const r = requestResponseMessage(epWithPendingListeners, {\n type: MessageType.GET,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(epWithPendingListeners, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously \u00AF\\_(\u30C4)_/\u00AF\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(\n epWithPendingListeners,\n {\n type: MessageType.SET,\n path: [...path, prop].map((p) => p.toString()),\n value,\n },\n transferables,\n ).then(fromWireValue) as Any;\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if ((last as Any) === createEndpoint) {\n return requestResponseMessage(epWithPendingListeners, {\n type: MessageType.ENDPOINT,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn\u2019t happen.\n if (last === \"bind\") {\n return createProxy(epWithPendingListeners, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n epWithPendingListeners,\n {\n type: MessageType.APPLY,\n path: path.map((p) => p.toString()),\n argumentList,\n },\n transferables,\n ).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(\n epWithPendingListeners,\n {\n type: MessageType.CONSTRUCT,\n path: path.map((p) => p.toString()),\n argumentList,\n },\n transferables,\n ).then(fromWireValue);\n },\n });\n registerProxy(proxy, epWithPendingListeners);\n return proxy as Any;\n}\n\nfunction myFlat<T>(arr: (T | T[])[]): T[] {\n return Array.prototype.concat.apply([], arr);\n}\n\nfunction processArguments(argumentList: Any[]): [WireValue[], Transferable[]] {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n}\n\nconst transferCache = new WeakMap<Any, Transferable[]>();\nexport function transfer<T>(obj: T, transfers: Transferable[]): T {\n transferCache.set(obj, transfers);\n return obj;\n}\n\nexport function proxy<T extends {}>(obj: T): T & ProxyMarked {\n return Object.assign(obj, { [proxyMarker]: true }) as Any;\n}\n\nexport function windowEndpoint(\n w: PostMessageWithOrigin,\n context: EventSource = globalThis,\n targetOrigin = \"*\",\n): Endpoint {\n return {\n postMessage: (msg: Any, transferables: Transferable[]) =>\n w.postMessage(msg, targetOrigin, transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context),\n };\n}\n\nfunction toWireValue(value: Any): [WireValue, Transferable[]] {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: WireValueType.HANDLER,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: WireValueType.RAW,\n value,\n },\n transferCache.get(value) || [],\n ];\n}\n\nfunction fromWireValue(value: WireValue): Any {\n switch (value.type) {\n case WireValueType.HANDLER:\n // biome-ignore lint/style/noNonNullAssertion: TODO: add an assertion?\n return transferHandlers.get(value.name)!.deserialize(value.value);\n case WireValueType.RAW:\n return value.value;\n }\n}\n\nfunction requestResponseMessage(\n epWithPendingListeners: EndpointWithPendingListeners,\n msg: Message,\n transfers?: Transferable[],\n): Promise<WireValue> {\n const ep = epWithPendingListeners.endpoint;\n const pendingListeners = epWithPendingListeners.pendingListeners;\n return new Promise((resolve) => {\n const id = generateUUID();\n pendingListeners.set(id, resolve);\n ep.start?.();\n ep.ref?.();\n ep.postMessage({ id, ...msg }, transfers);\n });\n}\n\nfunction generateUUID(): string {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n", "import type { Worker as NodeWorker } from \"node:worker_threads\";\n\ntype WebWorkerOptions = ConstructorParameters<typeof globalThis.Worker>[1];\ntype NodeWorkerOptions = ConstructorParameters<typeof NodeWorker>[1];\n\ntype WorkerOptions = WebWorkerOptions & NodeWorkerOptions;\n\nfunction isCrossOrigin(url: string | URL) {\n if (!globalThis.location) {\n return false;\n }\n const scriptOrigin = globalThis.location.origin;\n const workerOrigin = new URL(url, globalThis.location.href).origin;\n return scriptOrigin !== workerOrigin;\n}\n\nfunction constructPortableWebWorker(\n url: string | URL,\n workerOptions?: WebWorkerOptions,\n) {\n const useTrampoline = isCrossOrigin(url);\n\n // We could use the trampoline unconditionally, but this would require adding\n // `blob:` to the CSP unnecessarily. So we avoid it when possible.\n if (useTrampoline) {\n // Needed until something like\n // https://github.com/lgarron/worker-execution-origin or\n // https://github.com/whatwg/html/issues/6911 is available in all browser.\n const trampolineSource = `import ${JSON.stringify(url.toString())};`;\n const blob = new Blob([trampolineSource], {\n type: \"text/javascript\",\n });\n\n url = URL.createObjectURL(blob);\n }\n\n const worker = new globalThis.Worker(url, {\n ...workerOptions,\n type: \"module\",\n });\n\n if (useTrampoline) {\n const originalTerminate = worker.terminate.bind(worker);\n Object.defineProperty(worker, \"terminate\", {\n get() {\n // @ts-expect-error: TypeScript is not powerful enough to infer that `url` is always a string in this code path.\n URL.revokeObjectURL(url);\n originalTerminate();\n },\n });\n }\n\n return worker;\n}\n\nfunction constructNodeStyleWorker(\n url: URL | string,\n workerOptions?: NodeWorkerOptions,\n) {\n // We could theoretically use dynamic import, but:\n //\n // - 1. There is no synchronous way to do this conditionally. We can't do it\n // synchronously in a constructor, and while top-level `await` is\n // well-supported in runtimes it's not as easy to use with bundlers.\n // 2. `.getBuiltinModule(\u2026)` signals more clearly that these are strictly\n // runtime dependencies.\n const { Worker: NodeWorker } = globalThis.process.getBuiltinModule(\n \"node:worker_threads\",\n );\n\n // `import.meta.resolve(\u2026)` is the recommended way to get the path to a\n // relative file to pass to the worker constructor. This returns a `file://\u2026`\n // URL as a string, which `bun` and `deno` accept for the worker constructor\n // but `node` does not. We can detect this and convert it to a `URL` to allow\n // more concise, idiomatic code across all platforms.\n url =\n typeof url === \"string\" && url.startsWith(\"file://\") ? new URL(url) : url;\n\n return new NodeWorker(url, workerOptions);\n}\n\ninterface GlobalThisWithMaybeUnreffableWorker {\n Worker?: {\n prototype: {\n unref?: () => void;\n };\n };\n}\n\nfunction constructPortableWorker(\n url: string | URL,\n workerOptions?: WorkerOptions,\n): Worker | NodeWorker {\n const hasWebWorkers = globalThis.Worker;\n const hasBuiltinModules = !!globalThis.process?.getBuiltinModule;\n\n if (hasWebWorkers && !hasBuiltinModules) {\n // Browsers\n return constructPortableWebWorker(url, workerOptions) as Worker &\n Record<Exclude<keyof NodeWorker, keyof Worker>, undefined>;\n }\n\n // Note that optional chaining *should* allow us to access `.unref` rather than\n const webWorkersHaveUnref = (\n globalThis as GlobalThisWithMaybeUnreffableWorker\n ).Worker?.prototype.unref;\n\n if (hasWebWorkers && hasBuiltinModules && webWorkersHaveUnref) {\n // `bun`\n return constructPortableWebWorker(url, workerOptions);\n } else {\n // `node` and `deno`\n return constructNodeStyleWorker(url, workerOptions);\n }\n}\n\ninterface PortableWorkerConstructor {\n new (url: string | URL, workerOptions?: WorkerOptions): Worker | NodeWorker;\n}\n\n// @ts-expect-error: Type wrangling\nexport const PortableWorker: PortableWorkerConstructor =\n constructPortableWorker;\n\n/** This type is useful to cast `Worker | NodeWorker` into a type where methods like `.unref?.()` can be called. */\nexport type WebWorkerOrNodeWorker =\n | (Worker & Record<Exclude<keyof NodeWorker, keyof Worker>, undefined>)\n | (NodeWorker & Record<Exclude<keyof Worker, keyof NodeWorker>, undefined>);\n"],
|
|
5
|
-
"mappings": "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AAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;A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",
|
|
6
|
-
"names": ["randomChoice", "randomChoice", "obj", "returnValue", "proxy"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/alg/common.ts", "../../../../src/cubing/alg/iteration.ts", "../../../../src/cubing/alg/alg-nodes/containers/Commutator.ts", "../../../../src/cubing/alg/alg-nodes/containers/Conjugate.ts", "../../../../src/cubing/alg/limits.ts", "../../../../src/cubing/alg/AlgBuilder.ts", "../../../../src/cubing/alg/alg-nodes/leaves/LineComment.ts", "../../../../src/cubing/alg/alg-nodes/leaves/Newline.ts", "../../../../src/cubing/alg/alg-nodes/leaves/Pause.ts", "../../../../src/cubing/alg/debug.ts", "../../../../src/cubing/alg/parseAlg.ts", "../../../../src/cubing/alg/warnOnce.ts", "../../../../src/cubing/alg/alg-nodes/QuantumWithAmount.ts", "../../../../src/cubing/alg/alg-nodes/leaves/Move.ts", "../../../../src/cubing/alg/alg-nodes/containers/Grouping.ts", "../../../../src/cubing/alg/is.ts", "../../../../src/cubing/alg/simplify/options.ts", "../../../../src/cubing/alg/simplify/append.ts", "../../../../src/cubing/alg/traversal.ts", "../../../../src/cubing/alg/simplify/simplify.ts", "../../../../src/cubing/alg/Alg.ts", "../../../../src/cubing/alg/example.ts", "../../../../src/cubing/alg/keyboard.ts", "../../../../src/cubing/alg/url.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Alg } from \"./Alg.ts\";\nimport type { AlgLeaf, AlgNode } from \"./alg-nodes/AlgNode.ts\";\nimport type { IterationDirection } from \"./iteration.ts\";\nimport type { ExperimentalSerializationOptions } from \"./SerializationOptions.ts\";\n\nlet writeAlgDebugField = false;\nexport function setAlgDebugField(debug: boolean): void {\n writeAlgDebugField = debug;\n}\n\nexport abstract class Comparable {\n is(c: any): boolean {\n return this instanceof c;\n }\n\n as<T>(c: new (...args: any) => T): T | null {\n return this instanceof c ? this : null;\n }\n\n abstract isIdentical(other: Comparable): boolean;\n}\n\nexport interface Repeatable extends Comparable {\n experimentalExpand(\n iterDir?: IterationDirection,\n depth?: number,\n ): Generator<AlgLeaf>;\n}\n\n// Common to `Alg` or `AlgNode` classes.\nexport abstract class AlgCommon<T extends Alg | AlgNode>\n extends Comparable\n implements Repeatable\n{\n constructor() {\n super();\n if (writeAlgDebugField) {\n Object.defineProperty(this, \"_debugStr\", {\n get: () => {\n return this.toString();\n },\n });\n }\n }\n\n get log(): (message?: any) => void {\n // By returning a (bound) version of `console.log`, we ensure that DevTools\n // logs the call site instead of this function.\n return console.log.bind(console, this, this.toString()) as (\n message?: any,\n ) => void;\n }\n\n abstract override toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string;\n\n abstract invert(): T;\n\n abstract experimentalExpand(iterDir: IterationDirection): Generator<AlgLeaf>;\n}\n", "export type IterationDirection =\n (typeof IterationDirection)[keyof typeof IterationDirection];\nexport const IterationDirection = {\n Forwards: 1,\n Backwards: -1,\n};\n\nexport function toggleDirection(\n iterationDirection: IterationDirection,\n flip: boolean = true,\n): IterationDirection {\n if (!flip) {\n return iterationDirection;\n }\n switch (iterationDirection) {\n case IterationDirection.Forwards:\n return IterationDirection.Backwards;\n case IterationDirection.Backwards:\n return IterationDirection.Forwards;\n }\n\n throw new Error(\"Invalid input iteration direction.\");\n}\n\nexport function direct<T>(\n g: Iterable<T>,\n iterDir: IterationDirection,\n): Iterable<T> {\n return iterDir === IterationDirection.Backwards ? Array.from(g).reverse() : g;\n}\n\nexport function reverse<T>(g: Iterable<T>): Iterable<T> {\n return Array.from(g).reverse();\n}\n\nexport function* directedGenerator<T>(\n g: Generator<T>,\n direction: IterationDirection,\n): Generator<T> {\n direction === IterationDirection.Backwards\n ? yield* reverseGenerator(g)\n : yield* g;\n}\n\nexport function* reverseGenerator<T>(g: Generator<T>): Generator<T> {\n for (const t of Array.from(g).reverse()) {\n yield t;\n }\n}\n", "import {\n type Alg,\n experimentalEnsureAlg,\n type FlexibleAlgSource,\n} from \"../../Alg.ts\";\nimport { AlgCommon, type Comparable } from \"../../common.ts\";\nimport { IterationDirection } from \"../../iteration.ts\";\nimport type { ExperimentalSerializationOptions } from \"../../SerializationOptions.ts\";\nimport type { AlgLeaf } from \"../AlgNode.ts\";\n\n/** @category Alg Nodes */\nexport class Commutator extends AlgCommon<Commutator> {\n readonly #A: Alg;\n readonly #B: Alg;\n\n constructor(aSource: FlexibleAlgSource, bSource: FlexibleAlgSource) {\n super();\n this.#A = experimentalEnsureAlg(aSource);\n this.#B = experimentalEnsureAlg(bSource);\n }\n\n get A(): Alg {\n return this.#A;\n }\n\n get B(): Alg {\n return this.#B;\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsCommutator = other.as(Commutator);\n return !!(\n otherAsCommutator?.A.isIdentical(this.A) &&\n otherAsCommutator?.B.isIdentical(this.B)\n );\n }\n\n invert(): Commutator {\n return new Commutator(this.#B, this.#A);\n }\n\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n if (depth === 0) {\n yield iterDir === IterationDirection.Forwards ? this : this.invert();\n } else {\n if (iterDir === IterationDirection.Forwards) {\n yield* this.A.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.B.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.A.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n yield* this.B.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n } else {\n yield* this.B.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.A.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.B.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n yield* this.A.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n }\n }\n }\n\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return `[${this.#A.toString(experimentalSerializationOptions)}, ${this.#B.toString(experimentalSerializationOptions)}]`;\n }\n}\n", "import {\n type Alg,\n experimentalEnsureAlg,\n type FlexibleAlgSource,\n} from \"../../Alg.ts\";\nimport { AlgCommon, type Comparable } from \"../../common.ts\";\nimport { IterationDirection } from \"../../iteration.ts\";\nimport type { ExperimentalSerializationOptions } from \"../../SerializationOptions.ts\";\nimport type { AlgLeaf } from \"../AlgNode.ts\";\n\n/** @category Alg Nodes */\nexport class Conjugate extends AlgCommon<Conjugate> {\n readonly #A: Alg;\n readonly #B: Alg;\n\n constructor(aSource: FlexibleAlgSource, bSource: FlexibleAlgSource) {\n super();\n this.#A = experimentalEnsureAlg(aSource);\n this.#B = experimentalEnsureAlg(bSource);\n }\n\n get A(): Alg {\n return this.#A;\n }\n\n get B(): Alg {\n return this.#B;\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsConjugate = other.as(Conjugate);\n return !!(\n otherAsConjugate?.A.isIdentical(this.A) &&\n otherAsConjugate?.B.isIdentical(this.B)\n );\n }\n\n invert(): Conjugate {\n return new Conjugate(this.#A, this.#B.invert());\n }\n\n *experimentalExpand(\n iterDir: IterationDirection,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n if (depth === 0) {\n yield iterDir === IterationDirection.Forwards ? this : this.invert();\n } else {\n yield* this.A.experimentalExpand(IterationDirection.Forwards, depth - 1);\n yield* this.B.experimentalExpand(iterDir, depth - 1);\n yield* this.A.experimentalExpand(IterationDirection.Backwards, depth - 1);\n }\n }\n\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return `[${this.A.toString(experimentalSerializationOptions)}: ${this.B.toString(experimentalSerializationOptions)}]`;\n }\n}\n", "export const MAX_INT = 0x7fffffff; // 2^31-1, the max value for signed 32-bit ints.\nexport const MAX_INT_DESCRIPTION = \"2^31 - 1\";\nexport const MIN_INT = -0x80000000;\nexport const MIN_INT_DESCRIPTION = \"-2^31\";\n", "import { Alg } from \"./Alg.ts\";\nimport type { AlgNode } from \"./alg-nodes/AlgNode.ts\";\n\n/** @category Alg */\nexport class AlgBuilder {\n #algNodes: AlgNode[] = [];\n\n push(u: AlgNode): void {\n this.#algNodes.push(u);\n }\n\n // TODO: Allow FlexibleAlgSource?\n /** @deprecated */\n experimentalPushAlg(alg: Alg): void {\n // TODO: Optimize?\n for (const u of alg.childAlgNodes()) {\n this.push(u);\n }\n }\n\n // TODO: can we guarantee this to be fast in the permanent API?\n experimentalNumAlgNodes(): number {\n return this.#algNodes.length;\n }\n\n // can be called multiple times, even if you push alg nodes inbetween.\n toAlg(): Alg {\n return new Alg(this.#algNodes);\n }\n\n reset(): void {\n this.#algNodes = [];\n }\n}\n", "import { AlgCommon, type Comparable } from \"../../common.ts\";\nimport { IterationDirection } from \"../../iteration.ts\";\nimport type { ExperimentalSerializationOptions } from \"../../SerializationOptions.ts\";\nimport type { AlgLeaf } from \"../AlgNode.ts\";\n\n// TODO: hash\n// TODO: this conflicts with the HTML `LineComment` class\n/** @category Alg Nodes */\nexport class LineComment extends AlgCommon<LineComment> {\n readonly #text: string;\n\n constructor(commentText: string) {\n super();\n if (commentText.includes(\"\\n\") || commentText.includes(\"\\r\")) {\n throw new Error(\"LineComment cannot contain newline\");\n }\n this.#text = commentText;\n }\n\n get text(): string {\n return this.#text;\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsLineComment = other as LineComment;\n return other.is(LineComment) && this.#text === otherAsLineComment.#text;\n }\n\n invert(): LineComment {\n return this;\n }\n\n *experimentalExpand(\n _iterDir: IterationDirection = IterationDirection.Forwards,\n _depth: number = Infinity,\n ): Generator<AlgLeaf> {\n yield this;\n }\n\n toString(\n _experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return `//${this.#text}`;\n }\n // toJSON(): LineCommentJSON {\n // return {\n // type: \"comment\",\n // text: this.#text,\n // };\n // }\n}\n", "import { AlgCommon, type Comparable } from \"../../common.ts\";\nimport { IterationDirection } from \"../../iteration.ts\";\nimport type { ExperimentalSerializationOptions } from \"../../SerializationOptions.ts\";\nimport type { AlgLeaf } from \"../AlgNode.ts\";\n\n/** @category Alg Nodes */\nexport class Newline extends AlgCommon<Newline> {\n toString(\n _experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return \"\\n\";\n }\n\n isIdentical(other: Comparable): boolean {\n return other.is(Newline);\n }\n\n invert(): Newline {\n return this;\n }\n\n *experimentalExpand(\n _iterDir: IterationDirection = IterationDirection.Forwards,\n _depth: number = Infinity,\n ): Generator<AlgLeaf> {\n yield this;\n }\n}\n", "import { AlgCommon, type Comparable } from \"../../common.ts\";\nimport { IterationDirection } from \"../../iteration.ts\";\nimport type { ExperimentalSerializationOptions } from \"../../SerializationOptions.ts\";\nimport type { AlgLeaf } from \"../AlgNode.ts\";\nimport type { Grouping } from \"../containers/Grouping.ts\";\n\n/** @category Alg Nodes */\nexport class Pause extends AlgCommon<Pause> {\n experimentalNISSGrouping?: Grouping; // TODO: tie this to the alg\n\n toString(\n _experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return \".\";\n }\n\n isIdentical(other: Comparable): boolean {\n return other.is(Pause);\n }\n\n invert(): Pause {\n return this;\n }\n\n *experimentalExpand(\n _iterDir: IterationDirection = IterationDirection.Forwards,\n _depth: number = Infinity,\n ): Generator<AlgLeaf> {\n yield this;\n }\n}\n", "type ReportingLevel = \"none\" | \"warn\" | \"error\";\nlet currentReportingLevel = \"warn\";\n\nconst MAX_NUMBER_OF_TIMES_TO_WARN = 10;\nlet numWarned = 0;\n\n// TODO: Avoid creating the string message if it won't be used (e.g. by taking a function?).\nexport function reportTypeMismatch(msg: string): void {\n switch (currentReportingLevel) {\n case \"error\":\n throw new Error(msg);\n case \"warn\": {\n numWarned++;\n if (numWarned < MAX_NUMBER_OF_TIMES_TO_WARN) {\n if (numWarned + 1 === MAX_NUMBER_OF_TIMES_TO_WARN) {\n console.warn(msg);\n }\n }\n return;\n }\n }\n}\n\nexport function setAlgPartTypeMismatchReportingLevel(\n level: ReportingLevel,\n): void {\n currentReportingLevel = level;\n}\n\nexport const algDebugGlobals: { caretNISSNotationEnabled: boolean } = {\n caretNISSNotationEnabled: true,\n};\n\nexport function setAlgDebug(options: {\n caretNISSNotationEnabled?: boolean;\n}): void {\n if (\"caretNISSNotationEnabled\" in options) {\n algDebugGlobals.caretNISSNotationEnabled =\n !!options.caretNISSNotationEnabled;\n }\n}\n", "import { Alg } from \"./Alg.ts\";\nimport { AlgBuilder } from \"./AlgBuilder.ts\";\nimport { Commutator } from \"./alg-nodes/containers/Commutator.ts\";\nimport { Conjugate } from \"./alg-nodes/containers/Conjugate.ts\";\nimport { Grouping } from \"./alg-nodes/containers/Grouping.ts\";\nimport type { AlgNode } from \"./alg-nodes/index.ts\";\nimport { LineComment } from \"./alg-nodes/leaves/LineComment.ts\";\nimport { Move, QuantumMove } from \"./alg-nodes/leaves/Move.ts\";\nimport { Newline } from \"./alg-nodes/leaves/Newline.ts\";\nimport { Pause } from \"./alg-nodes/leaves/Pause.ts\";\nimport { algDebugGlobals } from \"./debug.ts\";\n\ntype StoppingChar = \",\" | \":\" | \"]\" | \")\";\n\nfunction parseIntWithEmptyFallback<T>(n: string, emptyFallback: T): number | T {\n return n ? parseInt(n, 10) : emptyFallback;\n}\n\nconst AMOUNT_REGEX = /^(\\d+)?('?)/;\nconst MOVE_START_REGEX = /^[_\\dA-Za-z]/; // TODO: Handle slash\nconst QUANTUM_MOVE_REGEX = /^((([1-9]\\d*)-)?([1-9]\\d*))?([_A-Za-z]+)/;\nconst COMMENT_TEXT_REGEX = /^[^\\n]*/;\nconst SQUARE1_PAIR_START_REGEX = /^(-?\\d+), ?/; // TODO: match up with other whitespace handling?\nconst SQUARE1_PAIR_END_REGEX = /^(-?\\d+)\\)/; // TODO: match up with other whitespace handling?\n\nexport function parseAlg(s: string): Alg {\n return new AlgParser().parseAlg(s);\n}\n\nexport function parseMove(s: string): Move {\n return new AlgParser().parseMove(s);\n}\n\nexport function parseQuantumMove(s: string): QuantumMove {\n return new AlgParser().parseQuantumMove(s);\n}\n\nexport const startCharIndexKey = Symbol(\"startCharIndex\");\nexport const endCharIndexKey = Symbol(\"endCharIndex\");\n\nexport interface ParserIndexed {\n [startCharIndexKey]: number;\n [endCharIndexKey]: number;\n}\n\nexport type Parsed<T extends Alg | AlgNode> = T & ParserIndexed;\n\n// TODO: attach to parser so the end char index can default to `this.#idx`?\nfunction addCharIndices<T extends Alg | AlgNode>(\n t: T,\n startCharIndex: number,\n endCharIndex: number,\n): Parsed<T> {\n const parsedT = t as ParserIndexed & T;\n parsedT[startCharIndexKey] = startCharIndex;\n parsedT[endCharIndexKey] = endCharIndex;\n return parsedT;\n}\n\nexport function transferCharIndex<T extends Alg | AlgNode>(from: T, to: T): T {\n if (startCharIndexKey in from) {\n (to as Parsed<T>)[startCharIndexKey] = (from as Parsed<T>)[\n startCharIndexKey\n ];\n }\n if (endCharIndexKey in from) {\n (to as Parsed<T>)[endCharIndexKey] = (from as Parsed<T>)[endCharIndexKey];\n }\n return to;\n}\n\ntype MoveSuffix = \"+\" | \"++\" | \"-\" | \"--\";\n\n// TODO: support recording string locations for moves.\nclass AlgParser {\n #input: string = \"\";\n #idx: number = 0;\n #nissQueue: Grouping[] = [];\n\n parseAlg(input: string): Parsed<Alg> {\n this.#input = input;\n this.#idx = 0;\n const alg = this.parseAlgWithStopping([]);\n this.mustBeAtEndOfInput();\n const algNodes = Array.from(alg.childAlgNodes());\n if (this.#nissQueue.length > 0) {\n for (const nissGrouping of this.#nissQueue.reverse()) {\n algNodes.push(nissGrouping);\n }\n }\n const newAlg = new Alg(algNodes) as Parsed<Alg>;\n const {\n [startCharIndexKey]: startCharIndex,\n [endCharIndexKey]: endCharIndex,\n } = alg;\n addCharIndices(newAlg, startCharIndex, endCharIndex);\n return newAlg;\n }\n\n parseMove(input: string): Parsed<Move> {\n this.#input = input;\n this.#idx = 0;\n const move = this.parseMoveImpl();\n this.mustBeAtEndOfInput();\n return move;\n }\n\n parseQuantumMove(input: string): QuantumMove {\n this.#input = input;\n this.#idx = 0;\n const quantumMove = this.parseQuantumMoveImpl();\n this.mustBeAtEndOfInput();\n return quantumMove;\n }\n\n private mustBeAtEndOfInput() {\n if (this.#idx !== this.#input.length) {\n throw new Error(\"parsing unexpectedly ended early\");\n }\n }\n\n private parseAlgWithStopping(stopBefore: StoppingChar[]): Parsed<Alg> {\n let algStartIdx = this.#idx;\n let algEndIdx = this.#idx;\n const algBuilder = new AlgBuilder();\n\n // We're \"crowded\" if there was not a space or newline since the last alg node.\n let crowded = false;\n\n const mustNotBeCrowded = (idx: number): void => {\n if (crowded) {\n throw new Error(\n `Unexpected character at index ${idx}. Are you missing a space?`,\n ); // TODO better error message\n }\n };\n\n while (this.#idx < this.#input.length) {\n const savedCharIndex = this.#idx;\n if ((stopBefore as string[]).includes(this.#input[this.#idx])) {\n return addCharIndices(algBuilder.toAlg(), algStartIdx, algEndIdx);\n }\n if (this.tryConsumeNext(\" \")) {\n crowded = false;\n if (algBuilder.experimentalNumAlgNodes() === 0) {\n algStartIdx = this.#idx;\n }\n } else if (MOVE_START_REGEX.test(this.#input[this.#idx])) {\n mustNotBeCrowded(savedCharIndex);\n const move = this.parseMoveImpl();\n algBuilder.push(move);\n crowded = true;\n algEndIdx = this.#idx;\n } else if (this.tryConsumeNext(\"(\")) {\n mustNotBeCrowded(savedCharIndex);\n const sq1PairStartMatch = this.tryRegex(SQUARE1_PAIR_START_REGEX);\n if (sq1PairStartMatch) {\n const topAmountString = sq1PairStartMatch[1];\n const savedCharIndexD = this.#idx;\n const sq1PairEndMatch = this.parseRegex(SQUARE1_PAIR_END_REGEX);\n const uMove = addCharIndices(\n new Move(new QuantumMove(\"U_SQ_\"), parseInt(topAmountString, 10)),\n savedCharIndex + 1,\n savedCharIndex + 1 + topAmountString.length,\n );\n const dMove = addCharIndices(\n new Move(\n new QuantumMove(\"D_SQ_\"),\n parseInt(sq1PairEndMatch[1], 10),\n ),\n savedCharIndexD,\n this.#idx - 1,\n );\n const alg = addCharIndices(\n new Alg([uMove, dMove]),\n savedCharIndex + 1,\n this.#idx - 1,\n );\n algBuilder.push(\n addCharIndices(new Grouping(alg), savedCharIndex, this.#idx),\n );\n crowded = true;\n algEndIdx = this.#idx;\n } else {\n const alg = this.parseAlgWithStopping([\")\"]);\n this.mustConsumeNext(\")\");\n const amount = this.parseAmount();\n algBuilder.push(\n addCharIndices(\n new Grouping(alg, amount),\n savedCharIndex,\n this.#idx,\n ),\n );\n crowded = true;\n algEndIdx = this.#idx;\n }\n } else if (this.tryConsumeNext(\"^\")) {\n if (!algDebugGlobals.caretNISSNotationEnabled) {\n throw new Error(\n \"Alg contained a caret but caret NISS notation is not enabled.\",\n );\n }\n\n this.mustConsumeNext(\"(\");\n const alg = this.parseAlgWithStopping([\")\"]);\n this.popNext();\n\n const grouping = new Grouping(alg, -1);\n const placeholder = new Pause();\n\n grouping.experimentalNISSPlaceholder = placeholder;\n placeholder.experimentalNISSGrouping = grouping;\n\n this.#nissQueue.push(grouping);\n algBuilder.push(placeholder);\n } else if (this.tryConsumeNext(\"[\")) {\n mustNotBeCrowded(savedCharIndex);\n const A = this.parseAlgWithStopping([\",\", \":\"]);\n const separator = this.popNext();\n const B = this.parseAlgWithStopping([\"]\"]);\n this.mustConsumeNext(\"]\");\n let unrepeated: Commutator | Conjugate;\n switch (separator) {\n case \":\": {\n unrepeated = addCharIndices(\n new Conjugate(A, B),\n savedCharIndex,\n this.#idx,\n );\n crowded = true;\n algEndIdx = this.#idx;\n break;\n }\n case \",\": {\n unrepeated = addCharIndices(\n new Commutator(A, B),\n savedCharIndex,\n this.#idx,\n );\n crowded = true;\n algEndIdx = this.#idx;\n break;\n }\n default:\n throw new Error(\"unexpected parsing error\");\n }\n const afterClosingBracketIdx = this.#idx;\n const amount = this.parseAmount();\n if (amount === 1) {\n algBuilder.push(unrepeated);\n } else {\n const unrepeatedAlg = addCharIndices(\n new Alg([unrepeated]),\n savedCharIndex,\n afterClosingBracketIdx,\n );\n const grouping = addCharIndices(\n new Grouping(unrepeatedAlg, amount),\n savedCharIndex,\n this.#idx,\n );\n algBuilder.push(grouping);\n }\n crowded = true;\n algEndIdx = this.#idx;\n } else if (this.tryConsumeNext(\"\\n\")) {\n algBuilder.push(\n addCharIndices(new Newline(), savedCharIndex, this.#idx),\n );\n crowded = false;\n algEndIdx = this.#idx;\n } else if (this.tryConsumeNext(\"/\")) {\n if (this.tryConsumeNext(\"/\")) {\n mustNotBeCrowded(savedCharIndex);\n const [text] = this.parseRegex(COMMENT_TEXT_REGEX);\n algBuilder.push(\n addCharIndices(new LineComment(text), savedCharIndex, this.#idx),\n );\n crowded = false;\n algEndIdx = this.#idx;\n } else {\n // We allow crowding here to account for csTimer scrambles, which don't have a space between a Square-1 tuple and the following slash.\n algBuilder.push(\n addCharIndices(new Move(\"_SLASH_\"), savedCharIndex, this.#idx),\n );\n crowded = true;\n algEndIdx = this.#idx;\n }\n } else if (this.tryConsumeNext(\".\")) {\n mustNotBeCrowded(savedCharIndex);\n algBuilder.push(addCharIndices(new Pause(), savedCharIndex, this.#idx));\n crowded = true;\n algEndIdx = this.#idx;\n } else {\n throw new Error(`Unexpected character: ${this.popNext()}`);\n }\n }\n\n if (this.#idx !== this.#input.length) {\n throw new Error(\"did not finish parsing?\");\n }\n if (stopBefore.length > 0) {\n throw new Error(\"expected stopping\");\n }\n return addCharIndices(algBuilder.toAlg(), algStartIdx, algEndIdx);\n }\n\n private parseQuantumMoveImpl(): QuantumMove {\n const [, , , outerLayerStr, innerLayerStr, family] =\n this.parseRegex(QUANTUM_MOVE_REGEX);\n\n return new QuantumMove(\n family,\n parseIntWithEmptyFallback(innerLayerStr, undefined),\n parseIntWithEmptyFallback(outerLayerStr, undefined),\n );\n }\n\n private parseMoveImpl(): Parsed<Move> {\n const savedCharIndex = this.#idx;\n\n if (this.tryConsumeNext(\"/\")) {\n return addCharIndices(new Move(\"_SLASH_\"), savedCharIndex, this.#idx);\n }\n\n let quantumMove = this.parseQuantumMoveImpl();\n // Only `hadEmptyAbsAmount` is `const`.\n let [amount, hadEmptyAbsAmount] = this.parseAmountAndTrackEmptyAbsAmount();\n const suffix = this.parseMoveSuffix();\n\n if (suffix) {\n if (amount < 0) {\n throw new Error(\"uh-oh\");\n }\n if ((suffix === \"++\" || suffix === \"--\") && amount !== 1) {\n // TODO: Handle 1 vs. null\n throw new Error(\n \"Pochmann ++ or -- moves cannot have an amount other than 1.\",\n );\n }\n if ((suffix === \"++\" || suffix === \"--\") && !hadEmptyAbsAmount) {\n throw new Error(\n \"Pochmann ++ or -- moves cannot have an amount written as a number.\",\n );\n }\n if ((suffix === \"+\" || suffix === \"-\") && hadEmptyAbsAmount) {\n throw new Error(\n \"Clock dial moves must have an amount written as a natural number followed by + or -.\",\n );\n }\n if (suffix.startsWith(\"+\")) {\n quantumMove = quantumMove.modified({\n family: `${quantumMove.family}_${\n suffix === \"+\" ? \"PLUS\" : \"PLUSPLUS\"\n }_`, // TODO\n });\n }\n if (suffix.startsWith(\"-\")) {\n quantumMove = quantumMove.modified({\n family: `${quantumMove.family}_${\n suffix === \"-\" ? \"PLUS\" : \"PLUSPLUS\"\n }_`, // TODO\n });\n amount *= -1;\n }\n }\n\n const move = addCharIndices(\n new Move(quantumMove, amount),\n savedCharIndex,\n this.#idx,\n );\n return move;\n }\n\n private parseMoveSuffix(): MoveSuffix | null {\n if (this.tryConsumeNext(\"+\")) {\n if (this.tryConsumeNext(\"+\")) {\n return \"++\";\n }\n return \"+\";\n }\n if (this.tryConsumeNext(\"-\")) {\n if (this.tryConsumeNext(\"-\")) {\n return \"--\";\n }\n return \"-\";\n }\n return null;\n }\n\n private parseAmountAndTrackEmptyAbsAmount(): [number, boolean] {\n const savedIdx = this.#idx;\n const [, absAmountStr, primeStr] = this.parseRegex(AMOUNT_REGEX);\n if (absAmountStr?.startsWith(\"0\") && absAmountStr !== \"0\") {\n throw new Error(\n `Error at char index ${savedIdx}: An amount can only start with 0 if it's exactly the digit 0.`,\n );\n }\n return [\n parseIntWithEmptyFallback(absAmountStr, 1) * (primeStr === \"'\" ? -1 : 1),\n !absAmountStr,\n ];\n }\n\n private parseAmount(): number {\n const savedIdx = this.#idx;\n const [, absAmountStr, primeStr] = this.parseRegex(AMOUNT_REGEX);\n if (absAmountStr?.startsWith(\"0\") && absAmountStr !== \"0\") {\n throw new Error(\n `Error at char index ${savedIdx}: An amount number can only start with 0 if it's exactly the digit 0.`,\n );\n }\n return (\n parseIntWithEmptyFallback(absAmountStr, 1) * (primeStr === \"'\" ? -1 : 1)\n );\n }\n\n private parseRegex(regex: RegExp): RegExpExecArray {\n const arr = regex.exec(this.remaining());\n if (arr === null) {\n throw new Error(\"internal parsing error\"); // TODO\n }\n this.#idx += arr[0].length;\n return arr;\n }\n\n // TOD: can we avoid this?\n private tryRegex(regex: RegExp): RegExpExecArray | null {\n const arr = regex.exec(this.remaining());\n if (arr === null) {\n return null;\n }\n this.#idx += arr[0].length;\n return arr;\n }\n\n private remaining(): string {\n return this.#input.slice(this.#idx);\n }\n\n private popNext(): string {\n const next = this.#input[this.#idx];\n this.#idx++;\n return next;\n }\n\n private tryConsumeNext(expected: string): boolean {\n if (this.#input[this.#idx] === expected) {\n this.#idx++;\n return true;\n }\n return false;\n }\n\n private mustConsumeNext(expected: string): string {\n const next = this.popNext();\n if (next !== expected) {\n throw new Error(\n `expected \\`${expected}\\` while parsing, encountered ${next}`,\n ); // TODO: be more helpful\n }\n return next;\n }\n}\n", "const warned = new Set<string>();\nexport function warnOnce(s: string): void {\n if (!warned.has(s)) {\n console.warn(s);\n warned.add(s);\n }\n}\n", "import type { Repeatable } from \"../common.ts\";\nimport { type IterationDirection, toggleDirection } from \"../iteration.ts\";\nimport { MAX_INT, MAX_INT_DESCRIPTION, MIN_INT } from \"../limits.ts\";\nimport type { AlgLeaf } from \"./AlgNode.ts\";\n\nexport class QuantumWithAmount<Q extends Repeatable> {\n readonly quantum: Q;\n readonly amount: number;\n\n constructor(quantum: Q, amount: number = 1) {\n this.quantum = quantum;\n this.amount = amount;\n\n if (\n !Number.isInteger(this.amount) ||\n this.amount < MIN_INT ||\n this.amount > MAX_INT\n ) {\n throw new Error(\n `AlgNode amount absolute value must be a non-negative integer below ${MAX_INT_DESCRIPTION}.`,\n );\n }\n }\n\n suffix(): string {\n let s: string = \"\";\n // TODO\n const absAmount = Math.abs(this.amount);\n if (absAmount !== 1) {\n s += absAmount;\n }\n if (this.amount < 0) {\n s += \"'\";\n }\n return s;\n }\n\n isIdentical(other: QuantumWithAmount<Q>): boolean {\n return (\n this.quantum.isIdentical(other.quantum) && this.amount === other.amount\n );\n }\n\n // TODO: `Conjugate` and `Commutator` decrement `depth` inside the quantum, `Grouping` has to do it outside the quantum.\n *experimentalExpand(\n iterDir: IterationDirection,\n depth: number,\n ): Generator<AlgLeaf> {\n const absAmount = Math.abs(this.amount);\n const newIterDir = toggleDirection(iterDir, this.amount < 0);\n for (let i = 0; i < absAmount; i++) {\n yield* this.quantum.experimentalExpand(newIterDir, depth);\n }\n }\n}\n", "import { AlgCommon, Comparable } from \"../../common.ts\";\nimport { IterationDirection } from \"../../iteration.ts\";\nimport { MAX_INT, MAX_INT_DESCRIPTION } from \"../../limits.ts\";\nimport {\n parseMove,\n parseQuantumMove,\n transferCharIndex,\n} from \"../../parseAlg.ts\";\nimport type { ExperimentalSerializationOptions } from \"../../SerializationOptions.ts\";\nimport { warnOnce } from \"../../warnOnce.ts\";\nimport type { AlgLeaf } from \"../AlgNode.ts\";\nimport { QuantumWithAmount } from \"../QuantumWithAmount.ts\";\n\ninterface QuantumMoveModifications {\n outerLayer?: number;\n innerLayer?: number;\n family?: string;\n}\n\nexport class QuantumMove extends Comparable {\n readonly #family: string;\n readonly #innerLayer: number | null;\n readonly #outerLayer: number | null;\n\n constructor(\n family: string,\n innerLayer?: number | null,\n outerLayer?: number | null,\n ) {\n super();\n this.#family = family;\n this.#innerLayer = innerLayer ?? null;\n this.#outerLayer = outerLayer ?? null;\n Object.freeze(this);\n\n if (\n this.#innerLayer !== null &&\n (!Number.isInteger(this.#innerLayer) ||\n this.#innerLayer < 1 ||\n this.#innerLayer > MAX_INT)\n ) {\n throw new Error(\n `QuantumMove inner layer must be a positive integer below ${MAX_INT_DESCRIPTION}.`,\n );\n }\n\n if (\n this.#outerLayer !== null &&\n (!Number.isInteger(this.#outerLayer) ||\n this.#outerLayer < 1 ||\n this.#outerLayer > MAX_INT)\n ) {\n throw new Error(\n `QuantumMove outer layer must be a positive integer below ${MAX_INT_DESCRIPTION}.`,\n );\n }\n\n if (\n this.#outerLayer !== null &&\n this.#innerLayer !== null &&\n this.#innerLayer <= this.#outerLayer\n ) {\n throw new Error(\n \"QuantumMove outer layer must be smaller than inner layer.\",\n );\n }\n\n if (this.#outerLayer !== null && this.#innerLayer === null) {\n throw new Error(\n \"QuantumMove with an outer layer must have an inner layer\",\n ); // TODO: test\n }\n }\n\n static fromString(s: string): QuantumMove {\n return parseQuantumMove(s);\n }\n\n // TODO: `modify`?\n modified(modifications: QuantumMoveModifications): QuantumMove {\n return new QuantumMove(\n modifications.family ?? this.#family,\n modifications.innerLayer ?? this.#innerLayer,\n modifications.outerLayer ?? this.#outerLayer,\n );\n }\n\n isIdentical(other: QuantumMove): boolean {\n const otherAsQuantumMove = other;\n return (\n other.is(QuantumMove) &&\n this.#family === otherAsQuantumMove.#family &&\n this.#innerLayer === otherAsQuantumMove.#innerLayer &&\n this.#outerLayer === otherAsQuantumMove.#outerLayer\n );\n }\n\n // TODO: provide something more useful on average.\n /** @deprecated */\n get family(): string {\n return this.#family;\n }\n\n // TODO: provide something more useful on average.\n /** @deprecated */\n get outerLayer(): number | null {\n return this.#outerLayer;\n }\n\n // TODO: provide something more useful on average.\n /** @deprecated */\n get innerLayer(): number | null {\n return this.#innerLayer;\n }\n\n experimentalExpand(): Generator<AlgLeaf> {\n throw new Error(\n \"experimentalExpand() cannot be called on a `QuantumMove` directly.\",\n );\n }\n\n override toString(\n _experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n let s = this.#family;\n if (this.#innerLayer !== null) {\n s = String(this.#innerLayer) + s;\n if (this.#outerLayer !== null) {\n s = `${String(this.#outerLayer)}-${s}`;\n }\n }\n return s;\n }\n}\n\nexport interface MoveModifications {\n outerLayer?: number;\n innerLayer?: number;\n family?: string;\n amount?: number;\n}\n\n/** @category Alg Nodes */\nexport class Move extends AlgCommon<Move> {\n // @ts-expect-error False positive due to the `return` in the constructor.\n readonly #quantumWithAmount: QuantumWithAmount<QuantumMove>;\n\n constructor(\n ...args: [QuantumMove] | [QuantumMove, number] | [string] | [string, number]\n ) {\n super();\n if (typeof args[0] === \"string\") {\n if (args[1] ?? null) {\n this.#quantumWithAmount = new QuantumWithAmount(\n QuantumMove.fromString(args[0]),\n args[1],\n );\n return;\n } else {\n // biome-ignore lint/correctness/noConstructorReturn: https://github.com/rome/tools/issues/4005\n return Move.fromString(args[0]);\n }\n }\n this.#quantumWithAmount = new QuantumWithAmount<QuantumMove>(\n args[0],\n args[1],\n );\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsMove = other.as(Move);\n return (\n !!otherAsMove &&\n this.#quantumWithAmount.isIdentical(otherAsMove.#quantumWithAmount)\n );\n }\n\n invert(): Move {\n // TODO: handle char indices more consistently among alg nodes.\n return transferCharIndex(\n this,\n new Move(\n this.#quantumWithAmount.quantum,\n this.#isSlash() ? this.amount : -this.amount,\n ),\n );\n }\n\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n ): Generator<AlgLeaf> {\n if (iterDir === IterationDirection.Forwards) {\n yield this;\n } else {\n yield this.modified({\n amount: -this.amount,\n });\n }\n }\n\n get quantum(): QuantumMove {\n return this.#quantumWithAmount.quantum;\n }\n\n // TODO: `modify`?\n modified(modifications: MoveModifications): Move {\n // TODO: Avoid creating a new quantum move\n return new Move(\n this.#quantumWithAmount.quantum.modified(modifications),\n modifications.amount ?? this.amount,\n );\n }\n\n static fromString(s: string): Move {\n return parseMove(s);\n }\n\n get amount(): number {\n return this.#quantumWithAmount.amount;\n }\n\n /** @deprecated */\n get type(): string {\n warnOnce(\"deprecated: type\");\n return \"blockMove\";\n }\n\n /** @deprecated */\n get family(): string {\n return this.#quantumWithAmount.quantum.family ?? undefined;\n }\n\n /** @deprecated */\n get outerLayer(): number | undefined {\n return this.#quantumWithAmount.quantum.outerLayer ?? undefined;\n }\n\n /** @deprecated */\n get innerLayer(): number | undefined {\n return this.#quantumWithAmount.quantum.innerLayer ?? undefined;\n }\n\n #cachedSlashMove: Move | undefined;\n #isSlash(): boolean {\n return this.isIdentical((this.#cachedSlashMove ??= new Move(\"_SLASH_\")));\n }\n\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n if (experimentalSerializationOptions?.notation !== \"LGN\") {\n if (this.#isSlash()) {\n return \"/\"; // TODO: validate no amount\n }\n if (this.family.endsWith(\"_PLUS_\")) {\n return (\n this.#quantumWithAmount.quantum.toString().slice(0, -6) +\n Math.abs(this.amount) +\n (this.amount < 0 ? \"-\" : \"+\")\n ); // TODO\n }\n if (this.family.endsWith(\"_PLUSPLUS_\")) {\n const absAmount = Math.abs(this.amount);\n return (\n this.#quantumWithAmount.quantum.toString().slice(0, -10) +\n (absAmount === 1 ? \"\" : absAmount) +\n (this.amount < 0 ? \"--\" : \"++\")\n ); // TODO\n }\n }\n return (\n this.#quantumWithAmount.quantum.toString(\n experimentalSerializationOptions,\n ) + this.#quantumWithAmount.suffix()\n );\n }\n // // TODO: Serialize as a string?\n // toJSON(): MoveJSON {\n // return {\n // type: \"move\",\n // family: this.family,\n // innerLayer: this.innerLayer,\n // outerLayer: this.outerLayer,\n // };\n // }\n}\n", "import {\n Alg,\n experimentalEnsureAlg,\n type FlexibleAlgSource,\n} from \"../../Alg.ts\";\nimport { AlgCommon, type Comparable } from \"../../common.ts\";\nimport { IterationDirection } from \"../../iteration.ts\";\nimport type { ExperimentalSerializationOptions } from \"../../SerializationOptions.ts\";\nimport type { AlgLeaf, AlgNode } from \"../AlgNode.ts\";\nimport { Commutator, Conjugate } from \"../index.ts\";\nimport { Move, QuantumMove } from \"../leaves/Move.ts\";\nimport type { Pause } from \"../leaves/Pause.ts\";\nimport { QuantumWithAmount } from \"../QuantumWithAmount.ts\";\n\n// This is a workaround for `jest`, which doesn't handle cycles of imports inside `cubing/alg`.\n// We need to lazy-initialize the reusable quantum moves for Square-1, so we create this wrapper for it.\nclass Square1TupleFormatter {\n quantumU_SQ_: QuantumMove | null = null;\n quantumD_SQ_: QuantumMove | null = null;\n\n format(\n grouping: Grouping,\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string | null {\n if (experimentalSerializationOptions?.notation === \"LGN\") {\n return null;\n }\n\n if (grouping.amount !== 1) {\n return null;\n }\n const amounts = this.tuple(grouping);\n if (!amounts) {\n return null;\n }\n return `(${amounts.map((move) => move.amount).join(\", \")})`;\n }\n\n tuple(grouping: Grouping): [moveU: Move, moveD: Move] | null {\n if (grouping.amount !== 1) {\n return null;\n }\n\n this.quantumU_SQ_ ||= new QuantumMove(\"U_SQ_\");\n this.quantumD_SQ_ ||= new QuantumMove(\"D_SQ_\");\n\n const quantumAlg = grouping.alg;\n if (quantumAlg.experimentalNumChildAlgNodes() === 2) {\n const [U, D] = quantumAlg.childAlgNodes();\n if (\n U.as(Move)?.quantum.isIdentical(this.quantumU_SQ_) &&\n D.as(Move)?.quantum.isIdentical(this.quantumD_SQ_)\n ) {\n return [U as Move, D as Move]; // TODO: can we reuse the casting from above?\n }\n }\n return null;\n }\n}\nconst square1TupleFormatterInstance = new Square1TupleFormatter();\n\nexport interface GroupingModifications {\n alg?: Alg;\n amount?: number;\n}\n\n/** @category Alg Nodes */\nexport class Grouping extends AlgCommon<Grouping> {\n readonly #quantumWithAmount: QuantumWithAmount<Alg>;\n experimentalNISSPlaceholder?: Pause; // TODO: tie this to the alg\n\n constructor(algSource: FlexibleAlgSource, amount?: number) {\n super();\n const alg = experimentalEnsureAlg(algSource);\n this.#quantumWithAmount = new QuantumWithAmount(alg, amount);\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsGrouping = other as Grouping;\n return (\n other.is(Grouping) &&\n this.#quantumWithAmount.isIdentical(otherAsGrouping.#quantumWithAmount)\n );\n }\n\n get alg(): Alg {\n return this.#quantumWithAmount.quantum;\n }\n\n get amount(): number {\n return this.#quantumWithAmount.amount;\n }\n\n modified(modifications: GroupingModifications): Grouping {\n return new Grouping(\n modifications.alg ?? this.alg,\n modifications.amount ?? this.amount,\n );\n }\n\n /** @deprecated */\n get experimentalRepetitionSuffix(): string {\n return this.#quantumWithAmount.suffix();\n }\n\n invert(): Grouping {\n const amounts = square1TupleFormatterInstance.tuple(this);\n if (amounts) {\n const [moveU, moveD] = amounts;\n return new Grouping(new Alg([moveU.invert(), moveD.invert()]));\n }\n return new Grouping(\n this.#quantumWithAmount.quantum,\n -this.#quantumWithAmount.amount,\n );\n }\n\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n if (depth === 0) {\n yield iterDir === IterationDirection.Forwards ? this : this.invert();\n } else {\n yield* this.#quantumWithAmount.experimentalExpand(iterDir, depth - 1);\n }\n }\n\n static fromString(): Grouping {\n throw new Error(\"unimplemented\");\n }\n\n #unrepeatedString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string | null {\n const insideString = this.#quantumWithAmount.quantum.toString(\n experimentalSerializationOptions,\n );\n const iter = this.alg.childAlgNodes();\n const { value } = iter.next() as {\n value: AlgNode;\n done: boolean;\n };\n if (iter.next().done && (value?.is(Commutator) || value?.is(Conjugate))) {\n return insideString;\n }\n return `(${insideString})`;\n }\n\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return (\n square1TupleFormatterInstance.format(\n this,\n experimentalSerializationOptions,\n ) ??\n `${this.#unrepeatedString(experimentalSerializationOptions)}${this.#quantumWithAmount.suffix()}`\n );\n }\n\n experimentalAsSquare1Tuple(): [moveU: Move, moveD: Move] | null {\n return square1TupleFormatterInstance.tuple(this);\n }\n // toJSON(): GroupingJSON {\n // return {\n // type: \"grouping\",\n // alg: this.#quanta.quantum.toJSON(),\n // };\n // }\n}\n", "import type { Alg } from \"./Alg.ts\";\nimport {\n Commutator,\n Conjugate,\n Grouping,\n LineComment,\n Move,\n Newline,\n Pause,\n} from \"./alg-nodes/index.ts\";\n\nexport function experimentalIs(\n v: any,\n c:\n | typeof Alg\n | typeof Grouping\n | typeof LineComment\n | typeof Commutator\n | typeof Conjugate\n | typeof Move\n | typeof Newline\n | typeof Pause,\n): boolean {\n return v instanceof c;\n}\nexport function experimentalIsAlgNode(v: any): boolean {\n return (\n experimentalIs(v, Grouping) ||\n experimentalIs(v, LineComment) ||\n experimentalIs(v, Commutator) ||\n experimentalIs(v, Conjugate) ||\n experimentalIs(v, Move) ||\n experimentalIs(v, Newline) ||\n experimentalIs(v, Pause)\n );\n}\n", "import type { Move, QuantumMove } from \"../alg-nodes/index.ts\";\n\n// TODO: enums?\nconst DEFAULT_DIRECTIONAL = \"any-direction\";\nDEFAULT_DIRECTIONAL;\nexport type QuantumDirectionalCancellation =\n | typeof DEFAULT_DIRECTIONAL // Cancel any moves with the same quantum.\n | \"same-direction\" // Cancel two quantums when have non-zero amounts of the same sign (positive/negative). An amount of 0 always counts as the same direction as any other amount.\n | \"none\";\n\n// Example input: `R7' . R6' . R5' . R6` on a cube.\nexport type ModWrap =\n | \"none\" // R7' . R6' . R5' . R6\n | \"gravity\" // R . R2' . R' . R2\n | \"canonical-centered\" // R . R2 . R' . R2\n | \"canonical-positive\" // R . R2 . R3 . R2\n | \"preserve-sign\"; // R3' . R2' . R' . R2\n\nexport interface AppendCancelOptions {\n directional?: QuantumDirectionalCancellation;\n puzzleSpecificModWrap?: ModWrap; // Default depends on `directional`\n}\n\n// TODO: preserve single moves even when amount is 0?\nexport interface AppendOptions {\n cancel?: boolean | AppendCancelOptions; // Set to `true` to use future-proof defaults.\n // Takes precedence over the direct `puzzleSpecificSimplifyOptions` field.\n puzzleLoader?: {\n puzzleSpecificSimplifyOptions?: PuzzleSpecificSimplifyOptions;\n };\n puzzleSpecificSimplifyOptions?: PuzzleSpecificSimplifyOptions;\n}\n\nexport class AppendOptionsHelper {\n private config: AppendOptions;\n constructor(config: AppendOptions = {}) {\n this.config = config;\n }\n\n cancelQuantum(): QuantumDirectionalCancellation {\n const { cancel } = this.config;\n if (cancel === true) {\n return DEFAULT_DIRECTIONAL;\n }\n if (cancel === false) {\n return \"none\";\n }\n return cancel?.directional ?? \"none\";\n }\n\n cancelAny() {\n return this.config.cancel && this.cancelQuantum() !== \"none\";\n }\n\n cancelPuzzleSpecificModWrap(): ModWrap {\n const { cancel } = this.config;\n if (cancel === true || cancel === false) {\n return \"canonical-centered\";\n }\n if (cancel?.puzzleSpecificModWrap) {\n return cancel?.puzzleSpecificModWrap;\n }\n return cancel?.directional === \"same-direction\"\n ? \"preserve-sign\"\n : \"canonical-centered\";\n }\n\n puzzleSpecificSimplifyOptions(): PuzzleSpecificSimplifyOptions | undefined {\n return (\n this.config.puzzleLoader?.puzzleSpecificSimplifyOptions ??\n this.config.puzzleSpecificSimplifyOptions\n );\n }\n}\n\nexport interface SimplifyOptions extends AppendOptions {\n depth?: number | null; // TODO: test\n}\n\nexport interface PuzzleSpecificAxisSimplifyInfo {\n // All moves on the same axis *must* commute.\n areQuantumMovesSameAxis: (\n quantumMove1: QuantumMove,\n quantumMove2: QuantumMove,\n ) => boolean;\n simplifySameAxisMoves: (moves: Move[], quantumMod: boolean) => Move[];\n}\n\n// TODO: allow \"normal\" \"twisty\" puzzles to hardcode axis concepts without hardcoding too much in `Alg` that's not relevant to all puzzles.\nexport interface PuzzleSpecificSimplifyOptions {\n quantumMoveOrder?: (quantumMove: QuantumMove) => number;\n // TODO: implement cancellation for non-axis commuting moves (e.g. Megaminx: `BL R BL'` \u2192 `R`)\n // // Commutation is not transitive. For example, on Megaminx: BR and BL both commute with F, but not with each other.\n // doQuantumMovesCommute?: (\n // quantumMove1: QuantumMove,\n // quantumMove2: QuantumMove,\n // ) => boolean;\n axis?: PuzzleSpecificAxisSimplifyInfo;\n}\n", "import { Alg } from \"../Alg.ts\";\nimport type { AlgLeaf } from \"../alg-nodes/AlgNode.ts\";\nimport type { AlgNode } from \"../alg-nodes/index.ts\";\nimport { Move } from \"../alg-nodes/leaves/Move.ts\";\nimport { type AppendOptions, AppendOptionsHelper } from \"./options.ts\";\n\nfunction areSameDirection(direction: -1 | 1, move2: Move): boolean {\n // This multiplication has two properties:\n // - If either amount is 0, returns true.\n // - Otherwise, the signs have to match.\n return direction * Math.sign(move2.amount) >= 0;\n}\n\nexport function offsetMod(\n x: number,\n positiveMod: number,\n offset: number = 0,\n): number {\n return ((((x - offset) % positiveMod) + positiveMod) % positiveMod) + offset;\n}\n\nexport function experimentalAppendMove(\n alg: Alg,\n addedMove: Move,\n options?: AppendOptions,\n): Alg {\n const optionsHelper = new AppendOptionsHelper(options);\n\n const outputPrefix: AlgNode[] = Array.from(alg.childAlgNodes());\n let outputSuffix: Move[] = [addedMove];\n function output() {\n return new Alg([...outputPrefix, ...outputSuffix]); // TODO: What's the most efficient way to do this?\n }\n\n function modMove(move: Move): Move {\n if (optionsHelper.cancelPuzzleSpecificModWrap() === \"none\") {\n return move;\n }\n const quantumMoveOrder =\n optionsHelper.puzzleSpecificSimplifyOptions()?.quantumMoveOrder;\n if (!quantumMoveOrder) {\n return move;\n }\n const mod = quantumMoveOrder(addedMove.quantum)!; // TODO: throw if `undefined`?\n let offset: number;\n switch (optionsHelper.cancelPuzzleSpecificModWrap()) {\n case \"gravity\": {\n offset = -Math.floor((mod - (move.amount < 0 ? 0 : 1)) / 2); // TODO: dedup this calculation for the most common path?\n break;\n }\n case \"canonical-centered\": {\n offset = -Math.floor((mod - 1) / 2); // TODO: dedup this calculation for the most common path?\n break;\n }\n case \"canonical-positive\": {\n offset = 0;\n break;\n }\n case \"preserve-sign\": {\n offset = move.amount < 0 ? 1 - mod : 0;\n break;\n }\n default: {\n throw new Error(\"Unknown mod wrap\");\n }\n }\n const offsetAmount = offsetMod(move.amount, mod, offset);\n return move.modified({ amount: offsetAmount });\n }\n\n if (optionsHelper.cancelAny()) {\n let canCancelMoveBasedOnQuantum: (move: Move) => boolean;\n const axis = optionsHelper.puzzleSpecificSimplifyOptions()?.axis;\n if (axis) {\n canCancelMoveBasedOnQuantum = (move: Move): boolean =>\n axis.areQuantumMovesSameAxis(addedMove.quantum, move.quantum);\n } else {\n const newMoveQuantumString = addedMove.quantum.toString();\n canCancelMoveBasedOnQuantum = (move: Move): boolean =>\n move.quantum.toString() === newMoveQuantumString;\n }\n\n const sameDirectionOnly =\n optionsHelper.cancelQuantum() === \"same-direction\";\n\n const quantumDirections = new Map<string, 1 | 0 | -1>();\n quantumDirections.set(\n addedMove.quantum.toString(),\n Math.sign(addedMove.amount) as -1 | 0 | 1,\n );\n let i: number;\n for (i = outputPrefix.length - 1; i >= 0; i--) {\n const move = outputPrefix[i].as(Move);\n if (!move) {\n break;\n }\n if (!canCancelMoveBasedOnQuantum(move)) {\n break;\n }\n const quantumKey = move.quantum.toString();\n if (sameDirectionOnly) {\n const existingQuantumDirectionOnAxis =\n quantumDirections.get(quantumKey);\n if (\n existingQuantumDirectionOnAxis && // Short-circuits, but that's actually okay here.\n !areSameDirection(existingQuantumDirectionOnAxis, move)\n ) {\n break;\n }\n quantumDirections.set(quantumKey, Math.sign(move.amount) as -1 | 0 | 1);\n }\n }\n const suffix = [...(outputPrefix.splice(i + 1) as Move[]), addedMove];\n\n if (axis) {\n // TODO: pass down quantum mod\n outputSuffix = axis.simplifySameAxisMoves(\n suffix,\n optionsHelper.cancelPuzzleSpecificModWrap() !== \"none\",\n );\n } else {\n const amount = suffix.reduce(\n (sum: number, move: Move) => sum + move.amount,\n 0,\n );\n if (quantumDirections.size !== 1) {\n throw new Error(\n \"Internal error: multiple quantums when one was expected\",\n );\n }\n outputSuffix = [new Move(addedMove.quantum, amount)];\n }\n }\n outputSuffix = outputSuffix\n .map((m) => modMove(m))\n .filter((move: Move) => move.amount !== 0);\n return output();\n}\n\nexport function experimentalAppendNode(\n alg: Alg,\n leaf: AlgLeaf,\n options: AppendOptions,\n): Alg {\n const maybeMove = leaf.as(Move);\n if (maybeMove) {\n return experimentalAppendMove(alg, maybeMove, options);\n } else {\n return new Alg([...alg.childAlgNodes(), leaf]);\n }\n}\n", "import type { Alg } from \"./Alg.ts\";\nimport type { AlgNode } from \"./alg-nodes/AlgNode.ts\";\nimport { Commutator } from \"./alg-nodes/containers/Commutator.ts\";\nimport { Conjugate } from \"./alg-nodes/containers/Conjugate.ts\";\nimport { Grouping } from \"./alg-nodes/containers/Grouping.ts\";\nimport { LineComment } from \"./alg-nodes/leaves/LineComment.ts\";\nimport { Move } from \"./alg-nodes/leaves/Move.ts\";\nimport { Newline } from \"./alg-nodes/leaves/Newline.ts\";\nimport { Pause } from \"./alg-nodes/leaves/Pause.ts\";\nimport type { Comparable } from \"./common.ts\";\n\nfunction dispatch<DataDown, DataAlgUp, DataAlgNodeUp>(\n t: TraversalDownUp<DataDown, DataAlgUp, DataAlgNodeUp>,\n algNode: AlgNode,\n dataDown: DataDown,\n): DataAlgNodeUp {\n // TODO: Can we turn this back into a `switch` or something more efficiently?\n if (algNode.is(Grouping)) {\n return t.traverseGrouping(algNode as Grouping, dataDown);\n }\n if (algNode.is(Move)) {\n return t.traverseMove(algNode as Move, dataDown);\n }\n if (algNode.is(Commutator)) {\n return t.traverseCommutator(algNode as Commutator, dataDown);\n }\n if (algNode.is(Conjugate)) {\n return t.traverseConjugate(algNode as Conjugate, dataDown);\n }\n if (algNode.is(Pause)) {\n return t.traversePause(algNode as Pause, dataDown);\n }\n if (algNode.is(Newline)) {\n return t.traverseNewline(algNode as Newline, dataDown);\n }\n if (algNode.is(LineComment)) {\n return t.traverseLineComment(algNode as LineComment, dataDown);\n }\n throw new Error(\"unknown AlgNode\");\n}\n\nfunction mustBeAlgNode(t: Comparable): AlgNode {\n if (\n t.is(Grouping) ||\n t.is(Move) ||\n t.is(Commutator) ||\n t.is(Conjugate) ||\n t.is(Pause) ||\n t.is(Newline) ||\n t.is(LineComment)\n ) {\n return t as AlgNode;\n }\n throw new Error(\"internal error: expected AlgNode\"); // TODO: Make more helpful, add tests\n}\n\nexport abstract class TraversalDownUp<\n DataDown,\n DataAlgUp,\n DataAlgNodeUp = DataAlgUp,\n> {\n // Immediate subclasses should overwrite this.\n public traverseAlgNode(algNode: AlgNode, dataDown: DataDown): DataAlgNodeUp {\n return dispatch(this, algNode, dataDown);\n }\n\n public traverseIntoAlgNode(algNode: AlgNode, dataDown: DataDown): AlgNode {\n return mustBeAlgNode(this.traverseAlgNode(algNode, dataDown) as any);\n }\n\n public abstract traverseAlg(alg: Alg, dataDown: DataDown): DataAlgUp;\n\n public abstract traverseGrouping(\n grouping: Grouping,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traverseMove(move: Move, dataDown: DataDown): DataAlgNodeUp;\n\n public abstract traverseCommutator(\n commutator: Commutator,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traverseConjugate(\n conjugate: Conjugate,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traversePause(\n pause: Pause,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n public abstract traverseNewline(\n newline: Newline,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traverseLineComment(\n comment: LineComment,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n}\n\nexport abstract class TraversalUp<\n DataAlgUp,\n DataAlgNodeUp = DataAlgUp,\n> extends TraversalDownUp<undefined, DataAlgUp, DataAlgNodeUp> {\n public override traverseAlgNode(algNode: AlgNode): DataAlgNodeUp {\n return dispatch<unknown, DataAlgUp, DataAlgNodeUp>(\n this,\n algNode,\n undefined,\n );\n }\n\n public override traverseIntoAlgNode(algNode: AlgNode): AlgNode {\n return mustBeAlgNode(this.traverseAlgNode(algNode) as any);\n }\n\n public abstract override traverseAlg(alg: Alg): DataAlgUp;\n public abstract override traverseGrouping(grouping: Grouping): DataAlgNodeUp;\n public abstract override traverseMove(move: Move): DataAlgNodeUp;\n public abstract override traverseCommutator(\n commutator: Commutator,\n ): DataAlgNodeUp;\n public abstract override traverseConjugate(\n conjugate: Conjugate,\n ): DataAlgNodeUp;\n public abstract override traversePause(pause: Pause): DataAlgNodeUp;\n public abstract override traverseNewline(newline: Newline): DataAlgNodeUp;\n public abstract override traverseLineComment(\n comment: LineComment,\n ): DataAlgNodeUp;\n}\n\nexport function functionFromTraversal<\n DataDown,\n DataAlgUp,\n ConstructorArgs extends unknown[],\n>(\n traversalConstructor: {\n new (...args: ConstructorArgs): TraversalDownUp<DataDown, DataAlgUp, any>;\n },\n constructorArgs?: ConstructorArgs,\n): undefined extends DataDown\n ? (alg: Alg) => DataAlgUp\n : (alg: Alg, v: DataDown) => DataAlgUp {\n const instance = new traversalConstructor(\n ...(constructorArgs ?? ([] as any)),\n );\n return instance.traverseAlg.bind(instance) as any;\n}\n", "import { Alg } from \"../Alg.ts\";\nimport type { AlgNode } from \"../alg-nodes/AlgNode.ts\";\nimport { Commutator } from \"../alg-nodes/containers/Commutator.ts\";\nimport { Conjugate } from \"../alg-nodes/containers/Conjugate.ts\";\nimport { Grouping } from \"../alg-nodes/containers/Grouping.ts\";\nimport type { LineComment } from \"../alg-nodes/leaves/LineComment.ts\";\nimport { Move } from \"../alg-nodes/leaves/Move.ts\";\nimport type { Newline } from \"../alg-nodes/leaves/Newline.ts\";\nimport { Pause } from \"../alg-nodes/leaves/Pause.ts\";\nimport { functionFromTraversal, TraversalDownUp } from \"../traversal.ts\";\nimport { experimentalAppendNode } from \"./append.ts\";\nimport { AppendOptionsHelper, type SimplifyOptions } from \"./options.ts\";\n\n// TODO: Test that inverses are bijections.\nclass Simplify extends TraversalDownUp<SimplifyOptions, Generator<AlgNode>> {\n #newPlaceholderAssociationsMap?: Map<Grouping, Pause>;\n #newPlaceholderAssociations(): Map<Grouping, Pause> {\n return (this.#newPlaceholderAssociationsMap ??= new Map<Grouping, Pause>());\n }\n\n // TODO: avoid allocations?\n #descendOptions(options: SimplifyOptions): SimplifyOptions {\n return {\n ...options,\n depth: options.depth ? options.depth - 1 : null,\n };\n }\n\n // TODO: Handle\n public *traverseAlg(alg: Alg, options: SimplifyOptions): Generator<AlgNode> {\n if (options.depth === 0) {\n yield* alg.childAlgNodes();\n return;\n }\n\n let output: AlgNode[] = [];\n\n const newOptions: SimplifyOptions = this.#descendOptions(options); // TODO: avoid allocations?\n for (const algNode of alg.childAlgNodes()) {\n for (const traversedNode of this.traverseAlgNode(algNode, newOptions)) {\n output = Array.from(\n experimentalAppendNode(\n new Alg(output),\n traversedNode,\n newOptions,\n ).childAlgNodes(),\n );\n }\n }\n\n // TODO: try to use `yield* output[Symbol.iterator]();`?\n for (const newAlgNode of output) {\n yield newAlgNode;\n }\n }\n\n public *traverseGrouping(\n grouping: Grouping,\n options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (options.depth === 0) {\n yield grouping;\n return;\n }\n if (grouping.amount === 0) {\n // TODO: Are we okay with throwing away nested comments?\n return;\n }\n const newGrouping = new Grouping(\n this.traverseAlg(grouping.alg, this.#descendOptions(options)),\n grouping.amount,\n );\n if (newGrouping.alg.experimentalIsEmpty()) {\n return;\n }\n\n const newPlaceholder = this.#newPlaceholderAssociations().get(grouping);\n if (newPlaceholder) {\n newGrouping.experimentalNISSPlaceholder = newPlaceholder;\n newPlaceholder.experimentalNISSGrouping = newGrouping;\n }\n\n yield newGrouping;\n }\n\n public *traverseMove(\n move: Move,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n yield move;\n }\n\n #doChildrenCommute(A: Alg, B: Alg, options: SimplifyOptions): boolean {\n if (\n A.experimentalNumChildAlgNodes() === 1 &&\n B.experimentalNumChildAlgNodes() === 1\n ) {\n // Handle the special case where each side has been reduced to a single move.\n const aMove = Array.from(A.childAlgNodes())[0]?.as(Move);\n const bMove = Array.from(B.childAlgNodes())[0]?.as(Move);\n if (!(aMove && bMove)) {\n return false;\n }\n if (bMove.quantum.isIdentical(aMove.quantum)) {\n return true;\n }\n const appendOptionsHelper = new AppendOptionsHelper(options); // TODO: avoid re-allocating every time.\n if (\n appendOptionsHelper\n .puzzleSpecificSimplifyOptions()\n ?.axis?.areQuantumMovesSameAxis(aMove.quantum, bMove.quantum)\n ) {\n return true;\n }\n }\n return false;\n }\n\n public *traverseCommutator(\n commutator: Commutator,\n options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (options.depth === 0) {\n yield commutator;\n return;\n }\n const newOptions = this.#descendOptions(options);\n const newCommutator = new Commutator(\n this.traverseAlg(commutator.A, newOptions),\n this.traverseAlg(commutator.B, newOptions),\n );\n if (\n newCommutator.A.experimentalIsEmpty() ||\n newCommutator.B.experimentalIsEmpty() ||\n newCommutator.A.isIdentical(newCommutator.B) ||\n newCommutator.A.isIdentical(newCommutator.B.invert()) ||\n this.#doChildrenCommute(newCommutator.A, newCommutator.B, options)\n ) {\n return;\n }\n yield newCommutator;\n }\n\n public *traverseConjugate(\n conjugate: Conjugate,\n options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (options.depth === 0) {\n yield conjugate;\n return;\n }\n const newOptions = this.#descendOptions(options);\n const newConjugate = new Conjugate(\n this.traverseAlg(conjugate.A, newOptions),\n this.traverseAlg(conjugate.B, newOptions),\n );\n if (newConjugate.B.experimentalIsEmpty()) {\n return;\n }\n if (\n newConjugate.A.experimentalIsEmpty() ||\n newConjugate.A.isIdentical(newConjugate.B) ||\n newConjugate.A.isIdentical(newConjugate.B.invert()) ||\n this.#doChildrenCommute(newConjugate.A, newConjugate.B, options)\n ) {\n yield* conjugate.B.childAlgNodes();\n return;\n }\n yield newConjugate;\n }\n\n public *traversePause(\n pause: Pause,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (pause.experimentalNISSGrouping) {\n const newPause = new Pause();\n this.#newPlaceholderAssociations().set(\n pause.experimentalNISSGrouping,\n newPause,\n );\n yield newPause;\n } else {\n yield pause;\n }\n }\n\n public *traverseNewline(\n newline: Newline,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n yield newline;\n }\n\n public *traverseLineComment(\n comment: LineComment,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n yield comment;\n }\n}\n\nexport const simplify = functionFromTraversal(Simplify);\n", "// https://js.cubing.net/cubing/alg/\n\nimport type { AlgLeaf, AlgNode } from \"./alg-nodes/AlgNode.ts\";\nimport { Grouping, Pause } from \"./alg-nodes/index.ts\";\nimport { LineComment } from \"./alg-nodes/leaves/LineComment.ts\";\nimport { Move } from \"./alg-nodes/leaves/Move.ts\";\nimport { Newline } from \"./alg-nodes/leaves/Newline.ts\";\nimport { AlgCommon, type Comparable } from \"./common.ts\";\nimport { experimentalIs, experimentalIsAlgNode } from \"./is.ts\";\nimport { direct, IterationDirection, reverse } from \"./iteration.ts\";\nimport { parseAlg } from \"./parseAlg.ts\";\nimport type { ExperimentalSerializationOptions } from \"./SerializationOptions.ts\";\nimport { type SimplifyOptions, simplify } from \"./simplify/index.ts\";\nimport { warnOnce } from \"./warnOnce.ts\";\n\nexport type FlexibleAlgSource = string | Iterable<AlgNode> | Alg;\n\n// TODO: validate\nfunction toIterable(input?: FlexibleAlgSource): Iterable<AlgNode> {\n if (!input) {\n return [];\n }\n\n if (experimentalIs(input, Alg)) {\n return (input as Alg).childAlgNodes();\n }\n\n if (typeof input === \"string\") {\n return parseAlg(input).childAlgNodes(); // TODO: something more direct?\n }\n\n const iter = input as Iterable<AlgNode>;\n if (typeof iter[Symbol.iterator] === \"function\") {\n return iter; // TODO: avoid allocations\n }\n\n throw new Error(\"Invalid AlgNode\");\n}\n\n// Preserves the alg if it's already an `Alg`.\nexport function experimentalEnsureAlg(alg: FlexibleAlgSource): Alg {\n if (experimentalIs(alg, Alg)) {\n return alg as Alg;\n }\n return new Alg(alg);\n}\n\n/**\n * `Alg` is a class that encapsulates a structured alg. To create an `Alg` from a string, use:\n *\n * new Alg(\"R U R'\"); // Convenient\n * Alg.fromString(dynamicString); // Recommended when the string input is user-provided.\n *\n * Once you have an `Alg`, you can call methods to transform it:\n *\n * new Alg(\"[[R: U], R U R2']\").expand().experimentalSimplify({cancel: true}).invert().log()\n *\n * To convert an `Alg` to a string, use .toString():\n *\n * new Alg(\"R U F\").invert().toString();\n *\n * If you need to debug, you may also find it convenient to use .log():\n *\n * if (alg.isIdentical(alg.invert())) {\n * alg.log(\"A self-inverse!\")\n * }\n *\n * For more information, see: {@link https://js.cubing.net/cubing/alg/}\n *\n * @category Alg\n */\nexport class Alg extends AlgCommon<Alg> {\n // #debugString: string;\n #algNodes: Iterable<AlgNode>; // TODO: freeze?\n constructor(alg?: FlexibleAlgSource) {\n super();\n this.#algNodes = Array.from(toIterable(alg)); // TODO: can we avoid array-casting?\n // this.#debugString = this.toString();\n\n for (const algNode of this.#algNodes) {\n if (!experimentalIsAlgNode(algNode)) {\n throw new Error(\"An alg can only contain alg nodes.\");\n }\n }\n }\n\n /**\n * Checks whether this Alg is structurally identical to another Alg. This\n * essentially means that they are written identically apart from whitespace.\n *\n * const alg1 = new Alg(\"R U L'\");\n * const alg2 = new Alg(\"L U' R'\").invert();\n * // true\n * alg1.isIdentical(alg2);\n *\n * // false\n * new Alg(\"[R, U]\").isIdentical(new Alg(\"R U R' U'\"));\n * // true\n * new Alg(\"[R, U]\").expand().isIdentical(new Alg(\"R U R' U'\"));\n *\n * Note that .isIdentical() efficiently compares algorithms, but mainly exists\n * to help optimize code when the structure of an algorithm hasn't changed.\n * There are many ways to write the \"same\" alg on most puzzles, but is\n * *highly* recommended to avoid expanding two Alg instances to compare them,\n * since that can easily slow your program to a crawl if someone inputs an alg\n * containing a large repetition. In general, you should use `cubing/kpuzzle`\n * to compare if two algs have the same effect on a puzzle.\n *\n * Also note that parser annotations are not taken into account while comparing\n * algs:\n *\n * const alg = new Alg([new Move(\"R\"), new Move(\"U2\")]);\n * // true, even though one of the algs has parser annotations\n * alg.isIdentical(new Alg(\"R U2\"))\n *\n */\n isIdentical(other: Comparable): boolean {\n const otherAsAlg = other as Alg;\n if (!other.is(Alg)) {\n return false;\n }\n\n // TODO: avoid converting to array\n const l1 = Array.from(this.#algNodes);\n const l2 = Array.from(otherAsAlg.#algNodes);\n if (l1.length !== l2.length) {\n return false;\n }\n for (let i = 0; i < l1.length; i++) {\n if (!l1[i].isIdentical(l2[i])) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Returns the inverse of the given alg.\n *\n * Note that that this does not make any assumptions about what puzzle the alg\n * is for. For example, U2 is its own inverse on a cube, but U2' has the same\n * effect U3 (and not U2) on Megaminx:\n *\n * // Outputs: R U2' L'\n * new Alg(\"L U2 R'\").invert().log();\n */\n invert(): Alg {\n // TODO: Handle newLines and comments correctly\n // TODO: Make more efficient.\n return new Alg(reverse(Array.from(this.#algNodes).map((u) => u.invert())));\n }\n\n /** @deprecated Use {@link Alg.expand} instead. */\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n for (const algNode of direct(this.#algNodes, iterDir)) {\n yield* algNode.experimentalExpand(iterDir, depth);\n }\n }\n\n /**\n * Expands all Grouping, Commutator, and Conjugate parts nested inside the\n * alg.\n *\n * // F R U R' U' F'\n * new Alg(\"[F: [R, U]]\").expand().log();\n *\n * // F [R, U] F'\n * new Alg(\"[F: [R, U]]\").expand(({ depth: 1 }).log();\n *\n * Avoid calling this on a user-provided alg unless the user explicitly asks\n * to see the expanded alg. Otherwise, it's easy to make your program freeze\n * when someone passes in an alg like: (R U)10000000\n *\n * Generally, if you want to perform an operation on an entire alg, you'll\n * want to use something based on the `Traversal` mechanism, like countMoves()\n * from `cubing/notation`.\n */\n expand(options?: { depth?: number }): Alg {\n return new Alg(\n this.experimentalExpand(\n IterationDirection.Forwards,\n options?.depth ?? Infinity,\n ),\n );\n }\n\n /** @deprecated */\n *experimentalLeafMoves(): Generator<Move> {\n for (const leaf of this.experimentalExpand()) {\n if (leaf.is(Move)) {\n yield leaf as Move;\n }\n }\n }\n\n concat(input: FlexibleAlgSource): Alg {\n return new Alg(\n Array.from(this.#algNodes).concat(Array.from(toIterable(input))),\n );\n }\n\n /** @deprecated */\n experimentalIsEmpty(): boolean {\n for (const _ of this.#algNodes) {\n return false;\n }\n return true;\n }\n\n static fromString(s: string): Alg {\n return parseAlg(s);\n }\n\n /** @deprecated */\n units(): Generator<AlgNode> {\n return this.childAlgNodes();\n }\n\n *childAlgNodes(): Generator<AlgNode> {\n for (const algNode of this.#algNodes) {\n yield algNode;\n }\n }\n\n /** @deprecated */\n experimentalNumUnits(): number {\n return this.experimentalNumChildAlgNodes();\n }\n\n experimentalNumChildAlgNodes(): number {\n return Array.from(this.#algNodes).length;\n }\n\n /** @deprecated */\n get type(): string {\n warnOnce(\"deprecated: type\");\n return \"sequence\";\n }\n\n /**\n * Converts the Alg to a string:\n *\n * const alg = new Alg([new Move(\"R\"), new Move(\"U2\"), new Move(\"L\")])\n * // R U2 L\n * console.log(alg.toString())\n */\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n let output = \"\";\n let previousVisibleAlgNode: AlgNode | null = null;\n for (const algNode of this.#algNodes) {\n if (previousVisibleAlgNode) {\n output += spaceBetween(previousVisibleAlgNode, algNode);\n }\n const nissGrouping = algNode.as(Pause)?.experimentalNISSGrouping;\n if (nissGrouping) {\n if (nissGrouping.amount !== -1) {\n throw new Error(\"Invalid NISS Grouping amount!\");\n }\n output += `^(${nissGrouping.alg.toString(experimentalSerializationOptions)})`;\n } else if (algNode.as(Grouping)?.experimentalNISSPlaceholder) {\n // do not serialize (rely on the placeholder instead)\n } else {\n output += algNode.toString(experimentalSerializationOptions);\n }\n previousVisibleAlgNode = algNode;\n }\n return output;\n }\n\n /**\n * `experimentalSimplify` can perform several mostly-syntactic simplifications on an alg:\n *\n * // Logs: R' U3\n * import { Alg } from \"cubing/alg\";\n * new Alg(\"R R2' U U2\").experimentalSimplify({ cancel: true }).log()\n *\n * You can pass in a `PuzzleLoader` (currently only for 3x3x3) for puzzle-specific simplifications:\n *\n * // Logs: R' U'\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n * new Alg(\"R R2' U U2\").experimentalSimplify({ cancel: true, puzzleLoader: cube3x3x3 }).log()\n *\n * You can also cancel only moves that are in the same direction:\n *\n * // Logs: R R2' U'\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n * new Alg(\"R R2' U U2\").experimentalSimplify({\n * cancel: { directional: \"same-direction\" },\n * puzzleLoader: cube3x3x3\n * }).log()\n *\n * Additionally, you can specify how moves are \"wrapped\":\n *\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n *\n * function example(puzzleSpecificModWrap) {\n * alg.experimentalSimplify({\n * cancel: { puzzleSpecificModWrap },\n * puzzleLoader: cube3x3x3\n * }).log()\n * }\n *\n * const alg = new Alg(\"R7' . R6' . R5' . R6\")\n * example(\"none\") // R7' . R6' . R5' . R6\n * example(\"gravity\") // R . R2' . R' . R2\n * example(\"canonical-centered\") // R . R2 . R' . R2\n * example(\"canonical-positive\") // R . R2 . R3 . R2\n * example(\"preserve-sign\") // R3' . R2' . R' . R2\n *\n * Same-axis and simultaneous move canonicalization is not implemented yet:\n *\n * // Logs: R L R\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n * new Alg(\"R L R\").experimentalSimplify({ cancel: true, puzzleLoader: cube3x3x3 }).log()\n */\n experimentalSimplify(options?: SimplifyOptions): Alg {\n return new Alg(simplify(this, options ?? {}));\n }\n\n /** @deprecated See {@link experimentalSimplify} */\n simplify(options?: SimplifyOptions): Alg {\n return this.experimentalSimplify(options);\n }\n}\n\nfunction spaceBetween(u1: AlgNode, u2: AlgNode): string {\n if (u1.is(Newline) || u2.is(Newline)) {\n return \"\";\n }\n if (u2.as(Grouping)?.experimentalNISSPlaceholder) {\n return \"\";\n }\n if (u1.is(LineComment) && !u2.is(Newline)) {\n return \"\\n\"; /// TODO\n }\n return \" \";\n}\n", "// tslint:disable-next-line no-namespace // TODO: nested module\n\nimport { Alg } from \"./Alg.ts\";\nimport { Commutator } from \"./alg-nodes/containers/Commutator.ts\";\nimport { Conjugate } from \"./alg-nodes/containers/Conjugate.ts\";\nimport { Grouping } from \"./alg-nodes/index.ts\";\nimport { Move } from \"./alg-nodes/leaves/Move.ts\";\nimport { Pause } from \"./alg-nodes/leaves/Pause.ts\";\n\nexport const Example = {\n Sune: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"U\", 1),\n new Move(\"R\", 1),\n new Move(\"U\", -2),\n new Move(\"R\", -1),\n ]),\n\n AntiSune: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", 2),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"R\", 1),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n ]),\n\n SuneCommutator: new Alg([\n new Commutator(\n new Alg([new Move(\"R\", 1), new Move(\"U\", 1), new Move(\"R\", -2)]),\n new Alg([\n new Conjugate(new Alg([new Move(\"R\", 1)]), new Alg([new Move(\"U\", 1)])),\n ]),\n ),\n ]),\n\n Niklas: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", -1),\n new Move(\"L\", -1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"L\", 1),\n new Move(\"U\", 1),\n ]),\n\n EPerm: new Alg([\n new Move(\"x\", -1),\n new Commutator(\n new Alg([\n new Conjugate(\n new Alg([new Move(\"R\", 1)]),\n new Alg([new Move(\"U\", -1)]),\n ),\n ]),\n new Alg([new Move(\"D\", 1)]),\n ),\n new Commutator(\n new Alg([\n new Conjugate(new Alg([new Move(\"R\", 1)]), new Alg([new Move(\"U\", 1)])),\n ]),\n new Alg([new Move(\"D\", 1)]),\n ),\n new Move(\"x\", 1),\n ]),\n\n FURURFCompact: new Alg([\n new Conjugate(\n new Alg([new Move(\"F\", 1)]),\n new Alg([\n new Commutator(\n new Alg([new Move(\"U\", 1)]),\n new Alg([new Move(\"R\", 1)]),\n ),\n ]),\n ),\n ]),\n\n APermCompact: new Alg([\n new Conjugate(\n new Alg([new Move(\"R\", 2)]),\n new Alg([\n new Commutator(\n new Alg([new Move(\"F\", 2)]),\n new Alg([new Move(\"R\", -1), new Move(\"B\", -1), new Move(\"R\", 1)]),\n ),\n ]),\n ),\n ]),\n\n FURURFMoves: new Alg([\n new Move(\"F\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", 1),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n new Move(\"F\", -1),\n ]),\n\n TPerm: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n new Move(\"F\", 1),\n new Move(\"R\", 2),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"R\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"F\", -1),\n ]),\n\n HeadlightSwaps: new Alg([\n new Conjugate(\n new Alg([new Move(\"F\", 1)]),\n new Alg([\n new Grouping(\n new Alg([\n new Commutator(\n new Alg([new Move(\"R\", 1)]),\n new Alg([new Move(\"U\", 1)]),\n ),\n ]),\n 3,\n ),\n ]),\n ),\n ]),\n\n TriplePause: new Alg([new Pause(), new Pause(), new Pause()]),\n // AllAlgParts: [\n // new Alg([new Move(\"R\", 1), new Move(\"U\", -1)]),\n // new Grouping(new Alg([new Move(\"F\", 1)]), 2),\n // // new Rotation(\"y\", -1),\n // new Move(\"R\", 2),\n // new Commutator(new Alg([new Move(\"R\", 2)]), new Alg([new Move(\"U\", 2)]), 2),\n // new Conjugate(new Alg([new Move(\"L\", 2)]), new Alg([new Move(\"D\", -1)]), 2),\n // new Pause(),\n // new Newline(),\n // new LineComment(\"line comment\"),\n // ],\n};\n", "import type { KeyMapping } from \"../puzzles/PuzzleLoader.ts\";\nimport type { AlgLeaf } from \"./alg-nodes/AlgNode.ts\";\n\n// TODO: options about whether to ignore modifier keys (e.g. alt, ctrl).\n// TODO: Support different mappings.\n// TODO: Return BaseMove instead?\nexport function keyToMove(\n keyMapping: KeyMapping | undefined,\n e: KeyboardEvent,\n): AlgLeaf | null {\n if (e.altKey || e.ctrlKey) {\n return null;\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code\n // > The KeyboardEvent.code property represents a physical key on the keyboard\n // > (as opposed to the character generated by pressing the key). In other\n // > words, this property returns a value that isn't altered by keyboard\n // > layout or the state of the modifier keys.\n const layoutIndepdendentCode = e.code;\n return keyMapping?.[layoutIndepdendentCode] ?? null;\n}\n", "import type { Alg } from \"./Alg.ts\";\n\n// This is not the most sophisticated scheme, but it has been used in production\n// at alg.cubing.net for years.\nfunction serializeURLParam(a: Alg): string {\n let escaped = a.toString();\n escaped = escaped.replace(/_/g, \"_\").replace(/ /g, \"_\");\n escaped = escaped.replace(/\\+/g, \"b;\");\n escaped = escaped.replace(/-/g, \"-\").replace(/'/g, \"-\");\n return escaped;\n}\n\nexport interface AlgCubingNetOptions {\n alg?: Alg;\n setup?: Alg;\n title?: string;\n puzzle?:\n | \"1x1x1\"\n | \"2x2x2\"\n | \"3x3x3\"\n | \"4x4x4\"\n | \"5x5x5\"\n | \"6x6x6\"\n | \"7x7x7\"\n | \"8x8x8\"\n | \"9x9x9\"\n | \"10x10x10\"\n | \"11x11x11\"\n | \"12x12x12\"\n | \"13x13x13\"\n | \"14x14x14\"\n | \"16x16x16\"\n | \"17x17x17\";\n stage?:\n | \"full\"\n | \"cross\"\n | \"F2L\"\n | \"LL\"\n | \"OLL\"\n | \"PLL\"\n | \"CLS\"\n | \"ELS\"\n | \"L6E\"\n | \"CMLL\"\n | \"WV\"\n | \"ZBLL\"\n | \"void\";\n view?: \"editor\" | \"playback\" | \"fullscreen\";\n type?: \"moves\" | \"reconstruction\" | \"alg\" | \"reconstruction-end-with-setup\";\n}\n\n// TODO: runtime validation?\n/** @deprecated */\nexport function experimentalAlgCubingNetLink(\n options: AlgCubingNetOptions,\n): string {\n const url = new URL(\"https://alg.cubing.net\");\n if (!options.alg) {\n throw new Error(\"An alg parameter is required.\");\n }\n url.searchParams.set(\"alg\", serializeURLParam(options.alg));\n\n if (options.setup) {\n url.searchParams.set(\"setup\", serializeURLParam(options.setup));\n }\n if (options.title) {\n url.searchParams.set(\"title\", options.title);\n }\n if (options.puzzle) {\n if (\n ![\n \"1x1x1\",\n \"2x2x2\",\n \"3x3x3\",\n \"4x4x4\",\n \"5x5x5\",\n \"6x6x6\",\n \"7x7x7\",\n \"8x8x8\",\n \"9x9x9\",\n \"10x10x10\",\n \"11x11x11\",\n \"12x12x12\",\n \"13x13x13\",\n \"14x14x14\",\n \"16x16x16\",\n \"17x17x17\",\n ].includes(options.puzzle)\n ) {\n throw new Error(`Invalid puzzle parameter: ${options.puzzle}`);\n }\n url.searchParams.set(\"puzzle\", options.puzzle);\n }\n if (options.stage) {\n if (\n ![\n \"full\",\n \"cross\",\n \"F2L\",\n \"LL\",\n \"OLL\",\n \"PLL\",\n \"CLS\",\n \"ELS\",\n \"L6E\",\n \"CMLL\",\n \"WV\",\n \"ZBLL\",\n \"void\",\n ].includes(options.stage)\n ) {\n throw new Error(`Invalid stage parameter: ${options.stage}`);\n }\n url.searchParams.set(\"stage\", options.stage);\n }\n if (options.view) {\n if (![\"editor\", \"playback\", \"fullscreen\"].includes(options.view)) {\n throw new Error(`Invalid view parameter: ${options.view}`);\n }\n url.searchParams.set(\"view\", options.view);\n }\n if (options.type) {\n if (\n ![\n \"moves\",\n \"reconstruction\",\n \"alg\",\n \"reconstruction-end-with-setup\",\n ].includes(options.type)\n ) {\n throw new Error(`Invalid type parameter: ${options.type}`);\n }\n url.searchParams.set(\"type\", options.type);\n }\n return url.toString();\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/search/inside/solve/puzzles/2x2x2.ts", "../../../../src/cubing/search/inside/solve/tremble.ts", "../../../../src/cubing/search/inside/solve/twips.ts", "../../../../src/cubing/search/inside/solve/puzzles/dynamic/sgs-side-events/index.ts", "../../../../src/cubing/search/inside/solve/puzzles/dynamic/4x4x4/index.ts", "../../../../src/cubing/search/inside/solve/puzzles/4x4x4.ts", "../../../../src/cubing/search/inside/solve/puzzles/dynamic/fto/index.ts", "../../../../src/cubing/search/inside/solve/puzzles/fto.ts", "../../../../src/cubing/search/inside/solve/puzzles/dynamic/kilominx/index.ts", "../../../../src/cubing/search/inside/solve/puzzles/kilominx.ts", "../../../../src/cubing/search/inside/solve/puzzles/dynamic/master_tetraminx/index.ts", "../../../../src/cubing/search/inside/solve/puzzles/master_tetraminx.ts", "../../../../src/cubing/search/inside/solve/puzzles/megaminx.ts", "../../../../src/cubing/search/inside/solve/puzzles/pyraminx.ts", "../../../../src/cubing/search/inside/solve/puzzles/dynamic/sgs-unofficial/index.ts", "../../../../src/cubing/search/inside/solve/puzzles/redi_cube.ts", "../../../../src/cubing/search/inside/solve/puzzles/skewb.ts", "../../../../src/cubing/search/inside/api.ts", "../../../../src/cubing/search/inside/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { randomPermuteInPlace, randomUIntBelow } from \"random-uint-below\";\nimport type { Alg } from \"../../../../alg/index.ts\";\nimport type { KPuzzle } from \"../../../../kpuzzle/index.ts\";\nimport { KPattern } from \"../../../../kpuzzle/index.ts\";\nimport { cube2x2x2, puzzles } from \"../../../../puzzles/index.ts\";\nimport { mustBeInsideWorker } from \"../../inside-worker.ts\";\nimport type { SGSCachedData } from \"../parseSGS.ts\";\nimport { TrembleSolver } from \"../tremble.ts\";\nimport { wasmTwips } from \"../twips.ts\";\nimport { searchDynamicSideEvents } from \"./dynamic/sgs-side-events/index.ts\";\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const sgsCachedData: SGSCachedData = await (\n await searchDynamicSideEvents\n ).cachedData222();\n return new TrembleSolver(\n await puzzles[\"2x2x2\"].kpuzzle(),\n sgsCachedData,\n \"URFLBD\".split(\"\"),\n );\n })())\n );\n}\n\nexport async function preInitialize222(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\n// TODO: fix def consistency.\nexport async function solve222(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n return wasmTwips((await cube2x2x2.kpuzzle()).definition, pattern, {\n generatorMoves: \"UFLR\".split(\"\"),\n });\n}\n\n// TODO: factor out and test.\nfunction mutatingRandomizeOrbit(\n kpuzzle: KPuzzle,\n orbitName: string,\n pattern: KPattern,\n options?: { orientationSum?: number },\n): void {\n randomPermuteInPlace(pattern.patternData[orbitName].pieces);\n\n const orbitDefinition = kpuzzle.lookupOrbitDefinition(orbitName);\n const ori = pattern.patternData[orbitName].orientation;\n\n let sum = 0;\n for (let i = 0; i < orbitDefinition.numPieces; i++) {\n const o = randomUIntBelow(orbitDefinition.numOrientations);\n ori[i] = o;\n sum += o;\n }\n\n // console.log(\"aaaa\", options && \"orientationSum\" in options);\n if (options && \"orientationSum\" in options) {\n // console.log(\"sfdsf\", options!.orientationSum),\n ori[0] =\n (((ori[0] + options.orientationSum! - sum) %\n orbitDefinition.numOrientations) +\n orbitDefinition.numOrientations) %\n orbitDefinition.numOrientations;\n }\n}\n\n// TODO: Use SGS?\nexport async function random222Pattern(): Promise<KPattern> {\n const kpuzzle = await puzzles[\"2x2x2\"].kpuzzle();\n const patternCopy: KPattern = new KPattern(\n kpuzzle,\n structuredClone(kpuzzle.defaultPattern().patternData),\n ); // TODO\n mutatingRandomizeOrbit(kpuzzle, \"CORNERS\", patternCopy, {\n orientationSum: 0,\n });\n return patternCopy;\n}\n", "import { randomChoice } from \"random-uint-below\";\nimport { Alg, AlgBuilder, Move, type QuantumMove } from \"../../../alg/index.ts\";\nimport type { KPuzzle, KTransformation } from \"../../../kpuzzle/index.ts\";\nimport type { KPattern } from \"../../../kpuzzle/KPattern.ts\";\nimport { experimentalCountMoves } from \"../../../notation/index.ts\";\nimport type { SGSCachedData } from \"./parseSGS.ts\";\n\nconst DEFAULT_STAGE1_DEPTH_LIMIT = 2; // Moderately performant default.\n\nconst DOUBLECHECK_PLACED_PIECES = true;\nconst DEBUG = false;\n\n// TODO: Take moves instead of move names?\nfunction calculateMoves(\n kpuzzle: KPuzzle,\n moveNames: string[],\n): {\n move: Move;\n transformation: KTransformation;\n}[] {\n const searchMoves: {\n move: Move;\n transformation: KTransformation;\n }[] = [];\n // const identity = identityTransformation(def); // TODO\n // TODO: Make it easy to filter moves.\n for (const moveName of moveNames) {\n const rootMove = new Move(moveName);\n if (rootMove.amount !== 1) {\n throw new Error(\n \"SGS cannot handle def moves with an amount other than 1 yet.\",\n );\n }\n let transformation = kpuzzle.identityTransformation();\n for (let i = 1; ; i++) {\n transformation = transformation.applyMove(rootMove);\n if (transformation.isIdentityTransformation()) {\n break;\n }\n searchMoves.push({\n move: rootMove.modified({ amount: i }),\n transformation,\n });\n }\n }\n return searchMoves;\n}\n\n// function badRandomMoves(moves: string[], ksp: KSolvePuzzle): KSolvePuzzleState {\n// // var sum = 0;\n// var scramble = \"\";\n// for (var i = 0; i < 1000; i++) {\n// scramble = scramble + \" \" + moves[Math.floor(moves.length * Math.random())];\n// }\n// // var sol = \"\";\n// const indexer = new TreeAlgIndexer(ksp, Alg.fromString(scramble));\n// return indexer.transformAtIndex(indexer.numMoves()) as any; // TODO\n// }\n\nexport class TrembleSolver {\n private searchMoves: {\n move: Move;\n transformation: KTransformation;\n }[];\n\n constructor(\n private kpuzzle: KPuzzle,\n private sgs: SGSCachedData,\n trembleMoveNames?: string[],\n ) {\n this.searchMoves = calculateMoves(\n this.kpuzzle,\n trembleMoveNames ?? Object.keys(this.kpuzzle.definition.moves),\n );\n }\n\n // public badRandomMoves(): KSolvePuzzleState {\n // return badRandomMoves(this.moves, this.ksp);\n // }\n\n public async solve(\n pattern: KPattern,\n stage1DepthLimit: number = DEFAULT_STAGE1_DEPTH_LIMIT,\n quantumMoveOrder?: (quantumMove: QuantumMove) => number,\n ): Promise<Alg> {\n const transformation = pattern.experimentalToTransformation();\n if (!transformation) {\n throw new Error(\n \"distinguishable pieces are not supported in tremble solver yt\",\n );\n }\n let bestAlg: Alg | null = null;\n let bestLen = 1000000;\n const recur = (\n recursiveTransformation: KTransformation, // TODO: Support KStatq1\n togo: number,\n sofar: Alg,\n ) => {\n // console.log(\"recur\");\n if (togo === 0) {\n const sgsAlg = this.sgsPhaseSolve(recursiveTransformation, bestLen);\n if (!sgsAlg) {\n return;\n }\n // console.log(\"sgs done!\", sofar.toString(), \"|\", sgsAlg.toString());\n const newAlg = sofar.concat(sgsAlg).experimentalSimplify({\n cancel: {\n directional: \"any-direction\",\n puzzleSpecificModWrap: \"canonical-centered\",\n },\n puzzleSpecificSimplifyOptions: { quantumMoveOrder },\n });\n\n const len = experimentalCountMoves(newAlg);\n if (bestAlg === null || len < bestLen) {\n if (DEBUG) {\n console.log(`New best (${len} moves): ${newAlg.toString()}`);\n console.log(`Tremble moves are: ${sofar.toString()}`);\n }\n bestAlg = newAlg;\n bestLen = len;\n }\n return;\n }\n for (const searchMove of this.searchMoves) {\n recur(\n recursiveTransformation.applyTransformation(\n searchMove.transformation,\n ),\n togo - 1,\n sofar.concat([searchMove.move]),\n );\n }\n };\n for (let d = 0; d <= stage1DepthLimit; d++) {\n recur(transformation, d, new Alg());\n }\n if (bestAlg === null) {\n throw new Error(\"SGS search failed.\");\n }\n return bestAlg;\n }\n\n private sgsPhaseSolve(\n initialTransformation: KTransformation, // TODO: Handle KPattern\n bestLenSofar: number,\n ): Alg | null {\n // const pieceNames = \"UFR URB UBL ULF DRF DFL DLB DBR\".split(\" \");\n\n // function loggo(s: string) {\n // // console.warn(s);\n // // document.body.appendChild(document.createElement(\"div\")).textContent = s;\n // }\n\n // console.log(\"sgsPhaseSolve\");\n const algBuilder = new AlgBuilder();\n let transformation = initialTransformation;\n for (const step of this.sgs.ordering) {\n const cubieSeq = step.pieceOrdering;\n let key = \"\";\n const inverseTransformation = transformation.invert();\n for (let i = 0; i < cubieSeq.length; i++) {\n const loc = cubieSeq[i];\n const orbitName = loc.orbitName;\n const idx = loc.permutationIdx;\n key += ` ${inverseTransformation.transformationData[orbitName].permutation[idx]} ${inverseTransformation.transformationData[orbitName].orientationDelta[idx]}`;\n }\n // console.log(key, step.lookup);\n const info = step.lookup[key];\n if (!info) {\n throw new Error(\"Missing algorithm in sgs or esgs?\");\n }\n algBuilder.experimentalPushAlg(info.alg);\n if (algBuilder.experimentalNumAlgNodes() >= bestLenSofar) {\n return null;\n }\n transformation = transformation.applyTransformation(info.transformation);\n if (DOUBLECHECK_PLACED_PIECES) {\n for (let i = 0; i < cubieSeq.length; i++) {\n const location = cubieSeq[i];\n const orbitName = location.orbitName;\n const idx = location.permutationIdx;\n if (\n transformation.transformationData[orbitName].permutation[idx] !==\n idx ||\n transformation.transformationData[orbitName].orientationDelta[\n idx\n ] !== 0\n ) {\n throw new Error(\"bad SGS :-(\");\n }\n }\n }\n }\n return algBuilder.toAlg();\n }\n}\n\nexport function randomPatternFromSGS(\n kpuzzle: KPuzzle,\n sgs: SGSCachedData,\n): KPattern {\n let transformation = kpuzzle.identityTransformation();\n for (const step of sgs.ordering) {\n const sgsAction = randomChoice(Object.values(step.lookup));\n transformation = transformation.applyTransformation(\n sgsAction.transformation,\n );\n }\n return transformation.toKPattern();\n}\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\nimport type { Alg } from \"../../../alg/index.ts\";\nimport type {\n KPattern,\n KPatternData,\n KPuzzleDefinition,\n} from \"../../../kpuzzle/index.ts\";\n\nexport const twipsPromise = new LazyPromise(\n async () => import(\"../../../vendor/mpl/twips/index.js\"),\n);\n\nexport interface TwipsOptions {\n // TODO: start prune depth?\n generatorMoves?: string[];\n targetPattern?: KPatternData;\n minDepth?: number;\n maxDepth?: number;\n}\n\nexport async function wasmTwips(\n def: KPuzzleDefinition,\n pattern: KPattern,\n options?: TwipsOptions,\n): Promise<Alg> {\n const { wasmTwips } = await twipsPromise;\n return wasmTwips(def, pattern, options);\n}\n\nexport async function wasmRandomScrambleForEvent(\n eventID: string,\n): Promise<Alg> {\n const { wasmRandomScrambleForEvent } = await twipsPromise;\n return wasmRandomScrambleForEvent(eventID);\n}\n\nexport async function wasmDeriveScrambleForEvent(\n derivationSeedHex: string,\n derivationSaltHierarchy: string[],\n eventID: string,\n): Promise<Alg> {\n const { wasmDeriveScrambleForEvent } = await twipsPromise;\n return wasmDeriveScrambleForEvent(\n derivationSeedHex,\n derivationSaltHierarchy,\n eventID,\n );\n}\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\n\nexport const searchDynamicSideEvents = new LazyPromise(\n () => import(\"./search-dynamic-sgs-side-events.ts\"),\n);\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\n\nexport const dynamic4x4x4Solver = new LazyPromise(\n () => import(\"./search-dynamic-solve-4x4x4.ts\"),\n);\n", "import type { Alg } from \"../../../../alg/index.ts\";\nimport { mustBeInsideWorker } from \"../../inside-worker.ts\";\nimport { addOrientationSuffix } from \"../addOrientationSuffix.ts\";\nimport { dynamic4x4x4Solver } from \"./dynamic/4x4x4/index.ts\";\n\nconst randomSuffixes = [\n [null, \"x\", \"x2\", \"x'\", \"z\", \"z'\"],\n [null, \"y\", \"y2\", \"y'\"],\n];\n\nexport async function initialize444(): Promise<void> {\n return (await dynamic4x4x4Solver).initialize();\n}\n\nexport async function random444Scramble(): Promise<Alg> {\n mustBeInsideWorker();\n return (await dynamic4x4x4Solver).random444Scramble();\n}\n\nexport async function random444OrientedScramble(): Promise<Alg> {\n return addOrientationSuffix(await random444Scramble(), randomSuffixes);\n}\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\n\nexport const dynamicFTO = new LazyPromise(\n () => import(\"./search-dynamic-solve-fto.ts\"),\n);\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\nimport { Alg } from \"../../../../alg/index.ts\";\nimport type { KPattern } from \"../../../../kpuzzle/KPattern.ts\";\nimport { puzzles } from \"../../../../puzzles/index.ts\";\nimport { mustBeInsideWorker } from \"../../inside-worker.ts\";\nimport type { SGSCachedData } from \"../parseSGS.ts\";\nimport { TrembleSolver } from \"../tremble.ts\";\nimport { dynamicFTO } from \"./dynamic/fto/index.ts\";\n\nconst dynamic = new LazyPromise(\n () => import(\"./dynamic/sgs-unofficial/search-dynamic-sgs-unofficial.ts\"),\n);\n\nconst TREMBLE_DEPTH = 3;\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const json: SGSCachedData = await (await dynamic).sgsDataFTO();\n return new TrembleSolver(await puzzles[\"fto\"].kpuzzle(), json, [\n \"U\",\n \"R\",\n \"F\",\n \"L\",\n \"D\",\n \"B\",\n \"BR\",\n \"BL\",\n ]);\n })())\n );\n}\n\nexport async function preInitializeFTO(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\n// TODO: centers\nexport async function solveFTO(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n const trembleSolver = await getCachedTrembleSolver();\n const alg = await trembleSolver.solve(\n pattern,\n TREMBLE_DEPTH,\n () => 3, // TODO: Attach quantum move order lookup to puzzle.\n );\n return alg;\n}\n\nexport async function randomFTOScramble(): Promise<Alg> {\n mustBeInsideWorker();\n return new Alg(await (await dynamicFTO).getRandomFTOScramble());\n}\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\n\nexport const dynamicKilominxSolver = new LazyPromise<\n typeof import(\"./search-dynamic-solve-kilominx\")\n>(() => import(\"./search-dynamic-solve-kilominx.ts\"));\n", "import type { Alg } from \"../../../../alg/index.ts\";\nimport { mustBeInsideWorker } from \"../../inside-worker.ts\";\nimport { dynamicKilominxSolver } from \"./dynamic/kilominx/index.ts\";\n\nexport async function randomKilominxScramble(): Promise<Alg> {\n mustBeInsideWorker();\n return (await dynamicKilominxSolver).getRandomKilominxScramble();\n}\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\n\nexport const dynamicMasterTetraminxSolver = new LazyPromise(\n () => import(\"./search-dynamic-solve-master_tetraminx.ts\"),\n);\n", "import { Alg } from \"../../../../alg/index.ts\";\nimport { mustBeInsideWorker } from \"../../inside-worker.ts\";\nimport { dynamicMasterTetraminxSolver } from \"./dynamic/master_tetraminx/index.ts\";\n\nexport async function randomMasterTetraminxScramble(): Promise<Alg> {\n mustBeInsideWorker();\n return new Alg(\n await (\n await dynamicMasterTetraminxSolver\n ).randomMasterTetraminxScrambleString(),\n );\n}\n", "import type { Alg } from \"../../../../alg/index.ts\";\nimport type { KPatternData } from \"../../../../kpuzzle/index.ts\";\nimport { KPattern } from \"../../../../kpuzzle/index.ts\";\nimport { mustBeInsideWorker } from \"../../inside-worker.ts\";\nimport type { SGSCachedData } from \"../parseSGS.ts\";\nimport { TrembleSolver } from \"../tremble.ts\";\nimport { searchDynamicSideEvents } from \"./dynamic/sgs-side-events/index.ts\";\n\nconst TREMBLE_DEPTH = 2;\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const json: SGSCachedData = await (\n await searchDynamicSideEvents\n ).cachedSGSDataMegaminx();\n return new TrembleSolver(\n await (await searchDynamicSideEvents).cachedMegaminxKPuzzleWithoutMO(),\n json,\n [\"U\", \"R\", \"F\", \"L\", \"BR\", \"BL\", \"FR\", \"FL\", \"DR\", \"DL\", \"B\", \"D\"],\n );\n })())\n );\n}\n\nexport async function preInitializeMegaminx(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\n// TODO: centers\nexport async function solveMegaminx(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n const trembleSolver = await getCachedTrembleSolver();\n const patternDataWithoutMO: KPatternData = structuredClone(\n pattern.patternData,\n );\n patternDataWithoutMO[\"CENTERS\"].orientation = new Array(12).fill(0);\n const patternWithoutMO = new KPattern(\n await (await searchDynamicSideEvents).cachedMegaminxKPuzzleWithoutMO(),\n patternDataWithoutMO,\n );\n const alg = await trembleSolver.solve(\n patternWithoutMO,\n TREMBLE_DEPTH,\n () => 5, // TODO: Attach quantum move order lookup to puzzle.\n );\n return alg;\n}\n", "import type { Alg } from \"../../../../alg/index.ts\";\nimport type { KPattern } from \"../../../../kpuzzle/KPattern.ts\";\nimport { puzzles } from \"../../../../puzzles/index.ts\";\nimport { mustBeInsideWorker } from \"../../inside-worker.ts\";\nimport type { SGSCachedData } from \"../parseSGS.ts\";\nimport { randomPatternFromSGS, TrembleSolver } from \"../tremble.ts\";\nimport { searchDynamicSideEvents } from \"./dynamic/sgs-side-events/index.ts\";\n\nconst TREMBLE_DEPTH = 3;\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const json: SGSCachedData = await (\n await searchDynamicSideEvents\n ).sgsDataPyraminx();\n return new TrembleSolver(\n await puzzles[\"pyraminx\"].kpuzzle(),\n json,\n \"RLUB\".split(\"\"),\n );\n })())\n );\n}\n\nexport async function preInitializePyraminx(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\nexport async function solvePyraminx(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n const trembleSolver = await getCachedTrembleSolver();\n const alg = await trembleSolver.solve(pattern, TREMBLE_DEPTH, () => 3); // TODO: Attach quantum move order lookup to puzzle.\n return alg;\n}\n\nexport async function randomPyraminxPatternFixedOrientation(): Promise<KPattern> {\n mustBeInsideWorker();\n // Note: this sets all center orientations to 0.\n return randomPatternFromSGS(\n await puzzles[\"pyraminx\"].kpuzzle(),\n await (await searchDynamicSideEvents).sgsDataPyraminxFixedOrientation(),\n );\n}\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\n\nexport const searchDynamicUnofficial = new LazyPromise(\n () => import(\"./search-dynamic-sgs-unofficial.ts\"),\n);\n", "import type { Alg } from \"../../../../alg/index.ts\";\nimport { mustBeInsideWorker } from \"../../inside-worker.ts\";\nimport { searchDynamicUnofficial } from \"./dynamic/sgs-unofficial/index.ts\";\n\nexport async function randomRediCubeScramble(): Promise<Alg> {\n mustBeInsideWorker();\n return (await searchDynamicUnofficial).getRandomRediCubeScramble();\n}\n", "import type { Alg, QuantumMove } from \"../../../../alg/index.ts\";\nimport { KPattern } from \"../../../../kpuzzle/index.ts\";\nimport { mustBeInsideWorker } from \"../../inside-worker.ts\";\nimport type { SGSCachedData } from \"../parseSGS.ts\";\nimport { TrembleSolver } from \"../tremble.ts\";\nimport { searchDynamicSideEvents } from \"./dynamic/sgs-side-events/index.ts\";\n\nconst TREMBLE_DEPTH = 3;\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const json: SGSCachedData = await (\n await searchDynamicSideEvents\n ).sgsDataSkewb();\n return new TrembleSolver(\n await (await searchDynamicSideEvents).skewbKPuzzleWithoutMOCached(),\n json,\n \"RLUB\".split(\"\"),\n );\n })())\n );\n}\n\nexport async function preInitializeSkewb(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\nasync function resetCenterOrientation(pattern: KPattern): Promise<KPattern> {\n return new KPattern(\n await (await searchDynamicSideEvents).skewbKPuzzleWithoutMOCached(),\n {\n CORNERS: pattern.patternData[\"CORNERS\"],\n CENTERS: {\n pieces: pattern.patternData[\"CENTERS\"].pieces,\n orientation: new Array(6).fill(0),\n },\n },\n );\n}\n\n// TODO: fix def consistency.\nexport async function solveSkewb(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n const trembleSolver = await getCachedTrembleSolver();\n const alg = await trembleSolver.solve(\n await resetCenterOrientation(pattern),\n TREMBLE_DEPTH,\n (quantumMove: QuantumMove) => (quantumMove.family === \"y\" ? 4 : 3), // TODO: Attach quantum move order lookup to puzzle.\n );\n return alg;\n}\n", "import type { Alg } from \"../../alg/index.ts\";\nimport {\n KPattern,\n type KPatternData,\n KPuzzle,\n type KPuzzleDefinition,\n} from \"../../kpuzzle/index.ts\";\nimport { puzzles, wcaEvents } from \"../../puzzles/index.ts\";\nimport { setIsInsideWorker } from \"./inside-worker.ts\";\nimport { preInitialize222, solve222 } from \"./solve/puzzles/2x2x2.ts\";\nimport {\n initialize333,\n random333OrientedScramble,\n random333Scramble,\n solve333,\n} from \"./solve/puzzles/3x3x3/index.ts\";\nimport {\n initialize444,\n random444OrientedScramble,\n random444Scramble,\n} from \"./solve/puzzles/4x4x4.ts\";\nimport { randomFTOScramble } from \"./solve/puzzles/fto.ts\";\nimport { randomKilominxScramble } from \"./solve/puzzles/kilominx.ts\";\nimport { randomMasterTetraminxScramble } from \"./solve/puzzles/master_tetraminx.ts\";\nimport { solveMegaminx } from \"./solve/puzzles/megaminx.ts\";\nimport { solvePyraminx } from \"./solve/puzzles/pyraminx.ts\";\nimport { randomRediCubeScramble } from \"./solve/puzzles/redi_cube.ts\";\nimport { solveSkewb } from \"./solve/puzzles/skewb.ts\";\nimport {\n type TwipsOptions,\n wasmDeriveScrambleForEvent,\n wasmRandomScrambleForEvent,\n wasmTwips,\n} from \"./solve/twips.ts\";\n\nconst IDLE_PREFETCH_TIMEOUT_MS = 1000;\n\nsetIsInsideWorker(true);\n\nlet DEBUG_MEASURE_PERF = true;\nexport function setDebugMeasurePerf(newDebugMeasurePerf: boolean): void {\n DEBUG_MEASURE_PERF = newDebugMeasurePerf;\n}\n\nlet DEBUG_FORCE_TWIPS_FOR_SCRAMBLES = false;\nexport function setDebugForceTwipsForScrambles(\n forceTwipsForScrambles: boolean,\n): void {\n DEBUG_FORCE_TWIPS_FOR_SCRAMBLES = forceTwipsForScrambles;\n}\n\nfunction now() {\n return (typeof performance === \"undefined\" ? Date : performance).now();\n}\n\nasync function measurePerf<T>(\n name: string,\n f: () => T | Promise<T>,\n options?: { isPrefetch?: boolean },\n): Promise<T> {\n if (!DEBUG_MEASURE_PERF) {\n return f();\n }\n\n const start = now();\n const result = f();\n if ((result as any)?.then) {\n await result;\n }\n const end = now();\n console.warn(\n `${name}${options?.isPrefetch ? \" (prefetched)\" : \"\"}: ${Math.round(\n end - start,\n )}ms`,\n );\n return result;\n}\n\nconst prefetchPromises: Map<string, Promise<Alg>> = new Map();\n// This would just be a number, except `node` is extremely silly and returns an object instead.\n// https://nodejs.org/api/timers.html#settimeoutcallback-delay-args\nlet queuedPrefetchTimeoutID: ReturnType<typeof setTimeout> | null = null;\n\n// This is used to ensure only one scramble is running (and measured) at a time, as interleaving scrambles within a single worker isn't supported (yet).\n// Scrambles may perform async work (e.g. loading code), and this guard this prevents unintended interleaving.\nlet scrambleActivityLock: Promise<Alg>;\n\nasync function randomScrambleForEvent(\n eventID: string,\n options?: { isPrefetch?: boolean },\n): Promise<Alg> {\n return (scrambleActivityLock = (async () => {\n await scrambleActivityLock;\n function wasm(): Promise<Alg> {\n return measurePerf(\n `wasmRandomScrambleForEvent(${JSON.stringify(eventID)})`,\n () => wasmRandomScrambleForEvent(eventID),\n {\n isPrefetch: options?.isPrefetch,\n },\n );\n }\n\n function twipsOverride(): Promise<Alg> | undefined {\n if (\n DEBUG_FORCE_TWIPS_FOR_SCRAMBLES &&\n (eventID in wcaEvents || [\"kilominx\"].includes(eventID))\n ) {\n console.log(`Using \\`twips\\` override for \\`${eventID}\\` scramble.`);\n return wasm();\n }\n return undefined;\n }\n\n switch (eventID) {\n // case \"333\":\n case \"222\":\n return (await wasm()).experimentalSimplify({\n puzzleSpecificSimplifyOptions: {\n quantumMoveOrder: () => 4,\n },\n });\n // case \"444\":\n case \"555\":\n case \"666\":\n case \"777\":\n // case \"333bf\":\n case \"333fm\":\n // case \"333oh\":\n case \"clock\":\n case \"minx\":\n case \"pyram\":\n case \"skewb\":\n case \"sq1\":\n // case \"444bf\":\n case \"555bf\":\n // case \"333mbf\":\n // case \"fto\":\n // case \"master_tetraminx\":\n // case \"kilominx\":\n // case \"redi_cube\":\n case \"baby_fto\":\n return wasm();\n case \"333\":\n case \"333oh\":\n case \"333ft\":\n return (\n twipsOverride() ??\n measurePerf(\"random333Scramble\", random333Scramble, {\n isPrefetch: options?.isPrefetch,\n })\n );\n case \"333bf\":\n case \"333mbf\":\n return (\n twipsOverride() ??\n measurePerf(\"random333OrientedScramble\", random333OrientedScramble)\n );\n case \"444\":\n return (\n twipsOverride() ??\n measurePerf(\"random444Scramble\", random444Scramble, {\n isPrefetch: options?.isPrefetch,\n })\n );\n case \"444bf\":\n return (\n twipsOverride() ??\n measurePerf(\"random444OrientedScramble\", random444OrientedScramble)\n );\n case \"fto\":\n return measurePerf(\"randomFTOScramble\", randomFTOScramble, {\n isPrefetch: options?.isPrefetch,\n });\n case \"master_tetraminx\":\n return measurePerf(\n \"randomMasterTetraminxScramble\",\n randomMasterTetraminxScramble,\n );\n case \"kilominx\":\n return (\n twipsOverride() ??\n measurePerf(\"randomKilominxScramble\", randomKilominxScramble, {\n isPrefetch: options?.isPrefetch,\n })\n );\n case \"redi_cube\":\n return measurePerf(\"randomRediCubeScramble\", randomRediCubeScramble, {\n isPrefetch: options?.isPrefetch,\n });\n default:\n throw new Error(`unsupported event: ${eventID}`);\n }\n })());\n}\n\nexport enum PrefetchLevel {\n Auto = \"auto\",\n None = \"none\",\n Immediate = \"immediate\",\n}\n\nlet currentPrefetchLevel = PrefetchLevel.Auto;\n\nexport const insideAPI = {\n initialize: async (eventID: string) => {\n switch (eventID) {\n case \"222\":\n return measurePerf(\"preInitialize222\", preInitialize222);\n case \"333\":\n case \"333oh\":\n case \"333ft\":\n return measurePerf(\"initialize333\", initialize333);\n case \"444\":\n return measurePerf(\"initialize444\", initialize444);\n default:\n throw new Error(`unsupported event: ${eventID}`);\n }\n },\n\n setScramblePrefetchLevel(prefetchLevel: `${PrefetchLevel}`) {\n currentPrefetchLevel = prefetchLevel as PrefetchLevel;\n },\n\n randomScrambleForEvent: async (eventID: string): Promise<Alg> => {\n let promise = prefetchPromises.get(eventID);\n if (promise) {\n prefetchPromises.delete(eventID);\n } else {\n promise = randomScrambleForEvent(eventID);\n }\n if (currentPrefetchLevel !== PrefetchLevel.None) {\n promise.then(() => {\n // `queuedPrefetch` could be 0, but:\n // > Passing an invalid ID to clearTimeout() silently does nothing; no exception is thrown.\n // https://developer.mozilla.org/en-US/docs/Web/API/clearTimeout#notes\n if (queuedPrefetchTimeoutID) {\n clearTimeout(queuedPrefetchTimeoutID);\n }\n queuedPrefetchTimeoutID = setTimeout(\n () => {\n prefetchPromises.set(\n eventID,\n randomScrambleForEvent(eventID, {\n isPrefetch: true,\n }),\n );\n },\n currentPrefetchLevel === PrefetchLevel.Immediate\n ? 0\n : IDLE_PREFETCH_TIMEOUT_MS,\n );\n });\n }\n return promise;\n },\n\n randomScrambleStringForEvent: async (eventID: string): Promise<string> => {\n return (await insideAPI.randomScrambleForEvent(eventID)).toString();\n },\n\n deriveScrambleStringForEvent: async (\n derivationSeedHex: string,\n derivationSaltHierarchy: string[],\n eventID: string,\n ): Promise<string> => {\n const scramble = await measurePerf(\n `deriveScrambleForEvent(\u2026, ${JSON.stringify(eventID)})`,\n () =>\n wasmDeriveScrambleForEvent(\n derivationSeedHex,\n derivationSaltHierarchy,\n eventID,\n ),\n );\n return scramble.toString();\n },\n\n solve333ToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(await puzzles[\"3x3x3\"].kpuzzle(), patternData);\n return (await solve333(pattern)).toString();\n },\n\n solve222ToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(await puzzles[\"2x2x2\"].kpuzzle(), patternData);\n return (await solve222(pattern)).toString();\n },\n\n solveSkewbToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(await puzzles[\"skewb\"].kpuzzle(), patternData);\n return (await solveSkewb(pattern)).toString();\n },\n\n solvePyraminxToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(\n await puzzles[\"pyraminx\"].kpuzzle(),\n patternData,\n );\n return (await solvePyraminx(pattern)).toString();\n },\n\n solveMegaminxToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(\n await puzzles[\"megaminx\"].kpuzzle(),\n patternData,\n );\n return (await solveMegaminx(pattern)).toString();\n },\n\n setDebugMeasurePerf: async (measure: boolean): Promise<void> => {\n setDebugMeasurePerf(measure);\n },\n\n setDebugForceTwipsForScrambles: async (measure: boolean): Promise<void> => {\n setDebugForceTwipsForScrambles(measure);\n },\n\n solveTwipsToString: async (\n def: KPuzzleDefinition,\n patternData: KPatternData,\n options?: TwipsOptions,\n ): Promise<string> => {\n const kpuzzle = new KPuzzle(def);\n const pattern = new KPattern(kpuzzle, patternData);\n return (await wasmTwips(def, pattern, options)).toString();\n },\n};\n\nexport type WorkerAPI = typeof insideAPI;\n", "import { expose } from \"@cubing/comlink-everywhere\";\nimport { insideAPI } from \"./api.ts\";\n\nexpose(insideAPI);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["wasmTwips", "wasmRandomScrambleForEvent", "wasmDeriveScrambleForEvent", "cachedTrembleSolver", "getCachedTrembleSolver", "getCachedTrembleSolver", "TREMBLE_DEPTH", "cachedTrembleSolver", "getCachedTrembleSolver", "getCachedTrembleSolver", "TREMBLE_DEPTH", "TREMBLE_DEPTH", "cachedTrembleSolver", "getCachedTrembleSolver", "getCachedTrembleSolver", "TREMBLE_DEPTH"]
|
|
7
|
-
}
|