cubing 0.55.2 → 0.57.0
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-DFQMTDRG.js → chunk-J53ID3VX.js} +2 -2
- package/dist/bin/chunks/chunk-J53ID3VX.js.map +7 -0
- package/dist/bin/order.js +1 -1
- package/dist/bin/order.js.map +2 -2
- package/dist/bin/puzzle-geometry-bin.js +1 -1
- package/dist/bin/puzzle-geometry-bin.js.map +2 -2
- package/dist/bin/scramble.js +2 -1
- package/dist/bin/scramble.js.map +2 -2
- package/dist/lib/cubing/{PuzzleLoader-DGpDr4U9.d.ts → PuzzleLoader-Dd4G1VlU.d.ts} +358 -314
- package/dist/lib/cubing/alg/index.d.ts +9 -9
- package/dist/lib/cubing/alg/index.js +1 -1
- package/dist/lib/cubing/bluetooth/index.d.ts +11 -12
- package/dist/lib/cubing/bluetooth/index.js +72 -57
- package/dist/lib/cubing/bluetooth/index.js.map +3 -3
- package/dist/lib/cubing/{bluetooth-puzzle-C097rA5h.d.ts → bluetooth-puzzle-FIXncgc8.d.ts} +1 -1
- package/dist/lib/cubing/chunks/big-puzzle-orientation-IZASZS5A.js +70 -0
- package/dist/lib/cubing/chunks/big-puzzle-orientation-IZASZS5A.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-TQF5J7MH.js → chunk-3YVVF3KK.js} +79 -79
- package/dist/lib/cubing/chunks/chunk-3YVVF3KK.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-ZOU73IV5.js → chunk-CGV5LY7H.js} +2 -2
- package/dist/lib/cubing/chunks/chunk-CGV5LY7H.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-Y5U55NHQ.js → chunk-DWN2US56.js} +11 -11
- package/dist/lib/cubing/chunks/chunk-DWN2US56.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-PJH5IVDC.js → chunk-EVYENG3X.js} +40 -42
- package/dist/lib/cubing/chunks/chunk-EVYENG3X.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-BQNTAVTA.js → chunk-GKM2CK6T.js} +2 -2
- package/dist/lib/cubing/chunks/{chunk-MFK4M6PV.js → chunk-J6NSY47E.js} +120 -18
- package/dist/lib/cubing/chunks/chunk-J6NSY47E.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-2QDTMC3W.js → chunk-KAXXPFNE.js} +4 -4
- package/dist/lib/cubing/chunks/{chunk-2QDTMC3W.js.map → chunk-KAXXPFNE.js.map} +2 -2
- package/dist/lib/cubing/chunks/{chunk-SGPKF5IH.js → chunk-MITU5GJ5.js} +55 -51
- package/dist/lib/cubing/chunks/{chunk-SGPKF5IH.js.map → chunk-MITU5GJ5.js.map} +3 -3
- package/dist/lib/cubing/chunks/{chunk-WELOEBCE.js → chunk-SNKS5WOA.js} +166 -150
- package/dist/lib/cubing/chunks/chunk-SNKS5WOA.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-2SBMIHZV.js → chunk-SWKNZGJF.js} +100 -108
- package/dist/lib/cubing/chunks/chunk-SWKNZGJF.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-G3WJVG4K.js → chunk-XKTLEY2R.js} +2 -2
- package/dist/lib/cubing/chunks/chunk-XKTLEY2R.js.map +7 -0
- package/dist/lib/cubing/chunks/{inside-DZMTYTHV.js → inside-AF5A42Y6.js} +18 -18
- package/dist/lib/cubing/chunks/{inside-DZMTYTHV.js.map → inside-AF5A42Y6.js.map} +2 -2
- package/dist/lib/cubing/chunks/{puzzles-dynamic-side-events-QIADTLKJ.js → puzzles-dynamic-side-events-BOGUHF4Q.js} +1681 -1800
- package/dist/lib/cubing/chunks/puzzles-dynamic-side-events-BOGUHF4Q.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-EGIM6IYZ.js → search-dynamic-sgs-side-events-PVOJWVJF.js} +7 -7
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-EGIM6IYZ.js.map → search-dynamic-sgs-side-events-PVOJWVJF.js.map} +2 -2
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-R2TXOWXD.js → search-dynamic-sgs-unofficial-HRR5D2US.js} +648 -648
- package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-HRR5D2US.js.map +7 -0
- package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-6XXEHLWN.js → search-dynamic-solve-4x4x4-3CROPIQD.js} +7 -7
- package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-5YRST2XM.js → search-dynamic-solve-fto-NKAFVO65.js} +2 -2
- package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-W64XQPBF.js → search-dynamic-solve-kilominx-EDGE5SP4.js} +2 -2
- package/dist/lib/cubing/chunks/search-worker-entry.js +1 -1
- package/dist/lib/cubing/chunks/{twisty-dynamic-3d-H7YMZQPB.js → twisty-dynamic-3d-EIIPCTEF.js} +106 -93
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-EIIPCTEF.js.map +7 -0
- package/dist/lib/cubing/chunks/{twsearch-ZJ4WTIBT.js → twsearch-TGLVN7TI.js} +4 -4
- package/dist/lib/cubing/chunks/twsearch-TGLVN7TI.js.map +7 -0
- package/dist/lib/cubing/chunks/twsearch_wasm_bg-NHUYB5UW-HHHVHFI5.js +10 -0
- package/dist/lib/cubing/chunks/twsearch_wasm_bg-NHUYB5UW-HHHVHFI5.js.map +7 -0
- package/dist/lib/cubing/{index-3pTbhXFM.d.ts → index-Drw5ySJm.d.ts} +2 -2
- 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 -4
- package/dist/lib/cubing/notation/index.js +4 -4
- package/dist/lib/cubing/protocol/index.d.ts +2 -2
- package/dist/lib/cubing/protocol/index.js +4 -4
- package/dist/lib/cubing/puzzle-geometry/index.d.ts +3 -3
- package/dist/lib/cubing/puzzle-geometry/index.js +616 -483
- package/dist/lib/cubing/puzzle-geometry/index.js.map +3 -3
- 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 +3 -3
- package/dist/lib/cubing/scramble/index.js +6 -6
- package/dist/lib/cubing/search/index.d.ts +3 -3
- package/dist/lib/cubing/search/index.js +6 -6
- package/dist/lib/cubing/stream/index.d.ts +23 -23
- package/dist/lib/cubing/stream/index.js +41 -41
- package/dist/lib/cubing/stream/index.js.map +3 -3
- package/dist/lib/cubing/twisty/index.d.ts +9 -9
- package/dist/lib/cubing/twisty/index.js +3675 -3630
- package/dist/lib/cubing/twisty/index.js.map +4 -4
- package/package.json +16 -10
- package/dist/bin/chunks/chunk-DFQMTDRG.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-2SBMIHZV.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-G3WJVG4K.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-MFK4M6PV.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-PJH5IVDC.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-TQF5J7MH.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-WELOEBCE.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-Y5U55NHQ.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-ZOU73IV5.js.map +0 -7
- package/dist/lib/cubing/chunks/puzzles-dynamic-side-events-QIADTLKJ.js.map +0 -7
- package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-R2TXOWXD.js.map +0 -7
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-H7YMZQPB.js.map +0 -7
- package/dist/lib/cubing/chunks/twsearch-ZJ4WTIBT.js.map +0 -7
- package/dist/lib/cubing/chunks/twsearch_wasm_bg-FWKR4AQ6-XETKNJAN.js +0 -10
- package/dist/lib/cubing/chunks/twsearch_wasm_bg-FWKR4AQ6-XETKNJAN.js.map +0 -7
- /package/dist/lib/cubing/chunks/{chunk-BQNTAVTA.js.map → chunk-GKM2CK6T.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-6XXEHLWN.js.map → search-dynamic-solve-4x4x4-3CROPIQD.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-5YRST2XM.js.map → search-dynamic-solve-fto-NKAFVO65.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-W64XQPBF.js.map → search-dynamic-solve-kilominx-EDGE5SP4.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/notation/commonMetrics.ts", "../../../../src/cubing/notation/cube3x3x3Metrics.ts", "../../../../src/cubing/notation/CountMoves.ts", "../../../../src/cubing/notation/CountAnimatedLeaves.ts"],
|
|
4
|
-
"sourcesContent": ["export enum CommonMetric {\n // OBTM (Outer Block Turn Metric)\n OuterBlockTurnMetric = \"OBTM\",\n // RBTM (Range Block Turn Metric)\n RangeBlockTurnMetric = \"RBTM\",\n // SSTM (Single Slice Turn Metric)\n SingleSliceTurnMetric = \"SSTM\",\n // OBQTM (Outer Block Quantum Turn Metric)\n OuterBlockQuantumTurnMetric = \"OBQTM\",\n // RBQTM (Range Block Quantum Turn Metric)\n RangeBlockQuantumTurnMetric = \"RBQTM\",\n // SSQTM (Single Slice Quantum Turn Metric)\n SingleSliceQuantumTurnMetric = \"SSQTM\",\n ExecutionTurnMetric = \"ETM\",\n}\n\nexport enum CommonMetricAlias {\n // QTM (Quantum Turn Metric)\n QuantumTurnMetric = \"OBQTM\",\n // HTM (Hand Turn Metric)\n HandTurnMetric = \"OBTM\",\n // STM (Slice Turn Metric)\n SliceTurnMetric = \"RBTM\",\n}\n", "// TODO: move this into the 3x3x3 puzzle loader.\n\nimport type { Move } from \"../alg\";\nimport { experimentalCube3x3x3KPuzzleDefinition } from \"../puzzles/cubing-private\";\nimport { CommonMetric } from \"./commonMetrics\";\n\nenum MoveType {\n Rotation = \"Rotation\",\n Outer = \"Outer\",\n Inner = \"Inner\",\n}\n\nfunction uncachedMoveCount(moveQuantumString: string): MoveType {\n if (\n moveQuantumString.endsWith(\"v\") ||\n [\"x\", \"y\", \"z\"].includes(moveQuantumString)\n ) {\n // Rv\n return MoveType.Rotation;\n }\n if (\n moveQuantumString.startsWith(\"2\") ||\n [\"M\", \"E\", \"S\"].includes(moveQuantumString)\n ) {\n return MoveType.Inner;\n }\n return MoveType.Outer;\n}\n\nlet cache: Record<string, MoveType> | undefined;\nfunction getCache(): Record<string, MoveType> {\n if (cache) {\n return cache;\n }\n cache = {};\n const moveQuantumStrings = [\n ...Object.keys(experimentalCube3x3x3KPuzzleDefinition.moves),\n ...Object.keys(experimentalCube3x3x3KPuzzleDefinition.derivedMoves!),\n ];\n for (const moveQuantumString of moveQuantumStrings) {\n cache[moveQuantumString] = uncachedMoveCount(moveQuantumString);\n }\n return cache;\n}\n\n// Ancient wisdom: https://github.com/cubing/alg.js/blob/0599fad84d81b8d943ad3ea3e5dc191db8b6c157/alg.js#L638-L651\n/**\n * A move with an amount of 0 always has 0 cost. Else, the cost is\n *\n * constantFactor + amountFactor * Math.abs(move.amount)\n *\n */\nexport const costFactorsByMetric: Partial<\n Record<\n CommonMetric,\n Record<\n MoveType,\n {\n constantFactor: number;\n amountFactor: number;\n zeroAmount: number;\n }\n >\n >\n> = {\n // Note: these are hardcoded for 3x3x3. They will not automatically generalize to any other puzzles.\n [CommonMetric.OuterBlockTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 0, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Outer]: { constantFactor: 1, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Inner]: { constantFactor: 2, amountFactor: 0, zeroAmount: 0 },\n },\n [CommonMetric.RangeBlockTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 0, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Outer]: { constantFactor: 1, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Inner]: { constantFactor: 1, amountFactor: 0, zeroAmount: 0 },\n },\n [CommonMetric.OuterBlockQuantumTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 0, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Outer]: { constantFactor: 0, amountFactor: 1, zeroAmount: 0 },\n [MoveType.Inner]: { constantFactor: 0, amountFactor: 2, zeroAmount: 0 },\n },\n [CommonMetric.RangeBlockQuantumTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 0, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Outer]: { constantFactor: 0, amountFactor: 1, zeroAmount: 0 },\n [MoveType.Inner]: { constantFactor: 0, amountFactor: 1, zeroAmount: 0 },\n },\n [CommonMetric.ExecutionTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 1, amountFactor: 0, zeroAmount: 1 },\n [MoveType.Outer]: { constantFactor: 1, amountFactor: 0, zeroAmount: 1 },\n [MoveType.Inner]: { constantFactor: 1, amountFactor: 0, zeroAmount: 1 },\n },\n};\n\nexport function countMove3x3x3(metric: CommonMetric, move: Move): number {\n const costFactors = costFactorsByMetric[metric];\n if (!costFactors) {\n throw new Error(`Invalid metric for 3x3x3: ${metric}`);\n }\n const cache = getCache();\n const moveQuantumString = move.quantum.toString();\n if (!(moveQuantumString in cache)) {\n throw new Error(`Invalid move for 3x3x3 ${metric}: ${moveQuantumString}`);\n }\n const costType = cache[moveQuantumString];\n const { constantFactor, amountFactor, zeroAmount } = costFactors[costType];\n if (move.amount === 0) {\n return zeroAmount;\n }\n return constantFactor + amountFactor * Math.abs(move.amount);\n}\n", "// TODO: move this file somewhere permanent.\nimport {\n TraversalUp,\n functionFromTraversal,\n type Alg,\n type Commutator,\n type Conjugate,\n type Grouping,\n type LineComment,\n type Move,\n type Newline,\n type Pause,\n} from \"../alg\";\nimport type { PuzzleLoader } from \"../puzzles\";\nimport { CommonMetric } from \"./commonMetrics\";\nimport { costFactorsByMetric, countMove3x3x3 } from \"./cube3x3x3Metrics\";\n\n/*\n * For movecount, that understands puzzle rotations. This code\n * should be moved to the alg class, probably.\n */\nclass CountMoves extends TraversalUp<number> {\n constructor(private metric: (move: Move) => number) {\n super();\n }\n\n public traverseAlg(alg: Alg): number {\n let r = 0;\n for (const algNode of alg.childAlgNodes()) {\n r += this.traverseAlgNode(algNode);\n }\n return r;\n }\n\n public traverseGrouping(grouping: Grouping): number {\n const alg: Alg = grouping.alg;\n return this.traverseAlg(alg) * Math.abs(grouping.amount);\n }\n\n public traverseMove(move: Move): number {\n return this.metric(move);\n }\n\n public traverseCommutator(commutator: Commutator): number {\n return (\n 2 * (this.traverseAlg(commutator.A) + this.traverseAlg(commutator.B))\n );\n }\n\n public traverseConjugate(conjugate: Conjugate): number {\n return 2 * this.traverseAlg(conjugate.A) + this.traverseAlg(conjugate.B);\n }\n\n // TODO: Remove spaces between repeated pauses (in traverseSequence)\n public traversePause(_pause: Pause): number {\n return 0;\n }\n\n public traverseNewline(_newLine: Newline): number {\n return 0;\n }\n\n // TODO: Enforce being followed by a newline (or the end of the alg)?\n public traverseLineComment(_comment: LineComment): number {\n return 0;\n }\n}\n\n// TODO\nclass CountLeavesInExpansionForSimultaneousMoveIndexer extends TraversalUp<number> {\n public traverseAlg(alg: Alg): number {\n let r = 0;\n for (const algNode of alg.childAlgNodes()) {\n r += this.traverseAlgNode(algNode);\n }\n return r;\n }\n\n public traverseGrouping(grouping: Grouping): number {\n const alg: Alg = grouping.alg;\n return this.traverseAlg(alg) * Math.abs(grouping.amount);\n }\n\n public traverseMove(move: Move): number {\n return 1;\n }\n\n public traverseCommutator(commutator: Commutator): number {\n return (\n 2 * (this.traverseAlg(commutator.A) + this.traverseAlg(commutator.B))\n );\n }\n\n public traverseConjugate(conjugate: Conjugate): number {\n return 2 * this.traverseAlg(conjugate.A) + this.traverseAlg(conjugate.B);\n }\n\n // TODO: Remove spaces between repeated pauses (in traverseSequence)\n public traversePause(_pause: Pause): number {\n return 1;\n }\n\n public traverseNewline(_newLine: Newline): number {\n return 1;\n }\n\n // TODO: Enforce being followed by a newline (or the end of the alg)?\n public traverseLineComment(_comment: LineComment): number {\n return 1;\n }\n}\n\nfunction isCharUppercase(c: string): boolean {\n return \"A\" <= c && c <= \"Z\";\n}\n\n// TODO: Implement a puzzle-specific way to calculate this.\nfunction baseMetric(move: Move): number {\n const fam = move.family;\n if (\n (isCharUppercase(fam[0]) && fam[fam.length - 1] === \"v\") ||\n fam === \"x\" ||\n fam === \"y\" ||\n fam === \"z\" ||\n fam === \"T\"\n ) {\n return 0;\n } else {\n return 1;\n }\n}\n\nfunction etmMetric(_move: Move): number {\n return 1;\n}\n\n// TODO: Implement a puzzle-specific way to calculate this.\nfunction rangeBlockTurnMetric(move: Move): number {\n const fam = move.family;\n if (\n (isCharUppercase(fam[0]) && fam[fam.length - 1] === \"v\") ||\n fam === \"x\" ||\n fam === \"y\" ||\n fam === \"z\" ||\n fam === \"T\"\n ) {\n return 0;\n } else {\n return 1;\n }\n}\n\n// TODO: Implement a puzzle-specific way to calculate this.\nfunction quantumMetric(move: Move): number {\n return Math.abs(move.amount) * rangeBlockTurnMetric(move);\n}\n\nexport const countMoves = functionFromTraversal(CountMoves, [baseMetric]);\nexport const countMovesETM = functionFromTraversal(CountMoves, [etmMetric]);\nexport const countRangeBlockQuantumMovesPG = functionFromTraversal(CountMoves, [\n quantumMetric,\n]);\nexport const countRangeBlockMovesPG = functionFromTraversal(CountMoves, [\n rangeBlockTurnMetric,\n]);\n\nexport const countLeavesInExpansionForSimultaneousMoveIndexer =\n functionFromTraversal(CountLeavesInExpansionForSimultaneousMoveIndexer, [\n baseMetric,\n ]);\n\n/**\n * Only implemented so far:\n *\n * - 3x3x3: OBTM, RBTM, ETM\n */\nexport function countMetricMoves(\n puzzleLoader: PuzzleLoader,\n metric: CommonMetric,\n alg: Alg,\n): number {\n if (puzzleLoader.id === \"3x3x3\") {\n if (metric in costFactorsByMetric) {\n return functionFromTraversal(CountMoves, [\n (move: Move) => countMove3x3x3(metric, move),\n ])(alg);\n }\n } else {\n switch (metric) {\n case CommonMetric.ExecutionTurnMetric:\n return countMovesETM(alg);\n case CommonMetric.RangeBlockTurnMetric: {\n if (puzzleLoader.pg) {\n return countRangeBlockMovesPG(alg);\n }\n break;\n }\n case CommonMetric.RangeBlockQuantumTurnMetric: {\n if (puzzleLoader.pg) {\n return countRangeBlockQuantumMovesPG(alg);\n }\n break;\n }\n }\n }\n throw new Error(\"Unsupported puzzle or metric.\");\n}\n", "import {\n TraversalUp,\n functionFromTraversal,\n type Alg,\n type Commutator,\n type Conjugate,\n type Grouping,\n type LineComment,\n type Move,\n type Newline,\n type Pause,\n} from \"../alg\";\n\n// TODO: Include Pause, include amounts\nclass CountAnimatedLeaves extends TraversalUp<number, number> {\n public traverseAlg(alg: Alg): number {\n let total = 0;\n for (const part of alg.childAlgNodes()) {\n total += this.traverseAlgNode(part);\n }\n return total;\n }\n\n public traverseGrouping(grouping: Grouping): number {\n return this.traverseAlg(grouping.alg) * Math.abs(grouping.amount);\n }\n\n public traverseMove(_move: Move): number {\n return 1;\n }\n\n public traverseCommutator(commutator: Commutator): number {\n return (\n 2 * (this.traverseAlg(commutator.A) + this.traverseAlg(commutator.B))\n );\n }\n\n public traverseConjugate(conjugate: Conjugate): number {\n return 2 * this.traverseAlg(conjugate.A) + this.traverseAlg(conjugate.B);\n }\n\n public traversePause(_pause: Pause): number {\n return 1;\n }\n\n public traverseNewline(_newline: Newline): number {\n return 0;\n }\n\n public traverseLineComment(_comment: LineComment): number {\n return 0;\n }\n}\n\nexport const countAnimatedLeaves = functionFromTraversal(CountAnimatedLeaves);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommonMetric", "CommonMetricAlias", "cache"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/kpuzzle/combine.ts", "../../../../src/cubing/kpuzzle/construct.ts", "../../../../src/cubing/kpuzzle/KPattern.ts", "../../../../src/cubing/kpuzzle/KTransformation.ts", "../../../../src/cubing/kpuzzle/calculate.ts", "../../../../src/cubing/kpuzzle/KPuzzle.ts"],
|
|
4
|
-
"sourcesContent": ["import { isOrbitTransformationDataIdentityUncached } from \"./calculate\";\nimport type {\n KPuzzleDefinition,\n KPatternData,\n KPatternOrbitData,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\n\nexport function combineTransformationData(\n definition: KPuzzleDefinition,\n transformationData1: KTransformationData,\n transformationData2: KTransformationData,\n): KTransformationData {\n const newTransformationData = {} as KTransformationData;\n for (const orbitDefinition of definition.orbits) {\n const orbit1 = transformationData1[orbitDefinition.orbitName];\n const orbit2 = transformationData2[orbitDefinition.orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbit2,\n )\n ) {\n // common case for big cubes\n newTransformationData[orbitDefinition.orbitName] = orbit1;\n } else if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbit1,\n )\n ) {\n newTransformationData[orbitDefinition.orbitName] = orbit2;\n } else {\n const newPerm = new Array(orbitDefinition.numPieces);\n if (orbitDefinition.numOrientations === 1) {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: orbit1.orientationDelta,\n };\n } else {\n const newOri = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newOri[idx] =\n (orbit1.orientationDelta[orbit2.permutation[idx]] +\n orbit2.orientationDelta[idx]) %\n orbitDefinition.numOrientations;\n newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: newOri,\n };\n }\n }\n }\n return newTransformationData;\n}\n\nexport function applyTransformationDataToKPatternData(\n definition: KPuzzleDefinition,\n patternData: KPatternData,\n transformationData: KTransformationData,\n): KPatternData {\n const newPatternData = {} as KPatternData;\n for (const orbitDefinition of definition.orbits) {\n const patternOrbit = patternData[orbitDefinition.orbitName];\n const transformationOrbit = transformationData[orbitDefinition.orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n transformationOrbit,\n )\n ) {\n // common case for big cubes\n newPatternData[orbitDefinition.orbitName] = patternOrbit;\n } else {\n const newPieces = new Array(orbitDefinition.numPieces);\n if (orbitDefinition.numOrientations === 1) {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPieces[idx] =\n patternOrbit.pieces[transformationOrbit.permutation[idx]];\n }\n const newOrbitData: KPatternOrbitData = {\n pieces: newPieces,\n orientation: patternOrbit.orientation, // copy all 0\n };\n newPatternData[orbitDefinition.orbitName] = newOrbitData;\n } else {\n const newOrientation = new Array(orbitDefinition.numPieces);\n const newOrientationMod: number[] | undefined =\n patternOrbit.orientationMod\n ? new Array(orbitDefinition.numPieces)\n : undefined;\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n const transformationIdx = transformationOrbit.permutation[idx];\n let mod = orbitDefinition.numOrientations;\n if (patternOrbit.orientationMod) {\n const orientationMod =\n patternOrbit.orientationMod[transformationIdx];\n newOrientationMod![idx] = orientationMod;\n mod = orientationMod || orbitDefinition.numOrientations;\n }\n newOrientation[idx] =\n (patternOrbit.orientation[transformationIdx] +\n transformationOrbit.orientationDelta[idx]) %\n mod; // We don't have to use `modIntoRange` (assuming input is well-formed), because we're adding.\n newPieces[idx] = patternOrbit.pieces[transformationIdx];\n }\n const newOrbitData: KPatternOrbitData = {\n pieces: newPieces,\n orientation: newOrientation,\n };\n if (newOrientationMod) {\n newOrbitData.orientationMod = newOrientationMod;\n }\n newPatternData[orbitDefinition.orbitName] = newOrbitData;\n }\n }\n }\n return newPatternData;\n}\n", "import type { Move } from \"../alg\";\nimport { repeatTransformationUncached } from \"./calculate\";\nimport type { KPuzzle } from \"./KPuzzle\";\nimport type {\n KPuzzleDefinition,\n KTransformationData,\n KTransformationOrbitData,\n} from \"./KPuzzleDefinition\";\n\nconst FREEZE: boolean = false;\n\nconst identityOrbitCache = new Map<number, KTransformationOrbitData>();\nfunction constructIdentityOrbitTransformation(\n numPieces: number,\n): KTransformationOrbitData {\n const cached = identityOrbitCache.get(numPieces);\n if (cached) {\n return cached;\n }\n\n const newPermutation = new Array(numPieces);\n const newOrientation = new Array(numPieces);\n for (let i = 0; i < numPieces; i++) {\n newPermutation[i] = i;\n newOrientation[i] = 0;\n }\n const orbitTransformation = {\n permutation: newPermutation,\n orientationDelta: newOrientation,\n };\n if (FREEZE) {\n Object.freeze(newPermutation); // TODO\n Object.freeze(newOrientation); // TODO\n Object.freeze(orbitTransformation); // TODO\n }\n identityOrbitCache.set(numPieces, orbitTransformation);\n return orbitTransformation;\n}\n\nexport function constructIdentityTransformationDataUncached(\n definition: KPuzzleDefinition,\n): KTransformationData {\n const transformation = {} as KTransformationData;\n for (const orbitDefinition of definition.orbits) {\n transformation[orbitDefinition.orbitName] =\n constructIdentityOrbitTransformation(orbitDefinition.numPieces);\n }\n if (FREEZE) {\n Object.freeze(transformation); // TODO\n }\n return transformation;\n}\n\nexport function moveToTransformationUncached(\n kpuzzle: KPuzzle,\n move: Move,\n): KTransformationData {\n function getTransformationData(\n key: {\n toString: () => string;\n },\n multiplyAmount: number,\n ): KTransformationData | undefined {\n const s = key.toString();\n const movesDef = kpuzzle.definition.moves[s];\n if (movesDef) {\n return repeatTransformationUncached(kpuzzle, movesDef, multiplyAmount);\n }\n const derivedDef = kpuzzle.definition.derivedMoves?.[s];\n if (derivedDef) {\n return repeatTransformationUncached(\n kpuzzle,\n kpuzzle.algToTransformation(derivedDef).transformationData,\n multiplyAmount,\n );\n }\n return undefined;\n }\n\n // TODO: Use Euclid's algorithm to pre-calculate the GCD of moves for each\n // quantum, along with its transformation. This will make lookup `O(1)` for multiples of e.g. `y2`.\n\n const data =\n getTransformationData(move.quantum, move.amount) ??\n // Handle e.g. `y2` if `y2` is defined.\n // Note: this doesn't handle multiples.\n getTransformationData(move, 1) ??\n // Handle e.g. `y2'` if `y2` is defined.\n // Note: this doesn't handle multiples.\n getTransformationData(move.invert, -1);\n\n if (data) {\n return data;\n }\n throw new Error(`Invalid move for KPuzzle (${kpuzzle.name()}): ${move}`);\n}\n", "import type { Alg, Move } from \"../alg\";\nimport { isPatternDataIdentical } from \"./calculate\";\nimport { applyTransformationDataToKPatternData } from \"./combine\";\nimport type { KPuzzle, KTransformationSource } from \"./KPuzzle\";\nimport type {\n KPatternData,\n KTransformationData,\n KTransformationOrbitData,\n} from \"./KPuzzleDefinition\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport class KPattern {\n constructor(\n public readonly kpuzzle: KPuzzle,\n public readonly patternData: KPatternData,\n ) {}\n\n toJSON(): any {\n return {\n experimentalPuzzleName: this.kpuzzle.name(),\n patternData: this.patternData,\n };\n }\n\n static fromTransformation(transformation: KTransformation): KPattern {\n const newPatternData = applyTransformationDataToKPatternData(\n transformation.kpuzzle.definition,\n transformation.kpuzzle.definition.defaultPattern,\n transformation.transformationData,\n );\n return new KPattern(transformation.kpuzzle, newPatternData);\n }\n\n // Convenience function\n /** @deprecated */\n apply(source: KTransformationSource): KPattern {\n return this.applyTransformation(this.kpuzzle.toTransformation(source));\n }\n\n applyTransformation(transformation: KTransformation): KPattern {\n if (transformation.isIdentityTransformation()) {\n return new KPattern(this.kpuzzle, this.patternData);\n }\n const newPatternData = applyTransformationDataToKPatternData(\n this.kpuzzle.definition,\n this.patternData,\n transformation.transformationData,\n );\n return new KPattern(this.kpuzzle, newPatternData);\n }\n\n applyMove(move: Move | string): KPattern {\n return this.applyTransformation(this.kpuzzle.moveToTransformation(move));\n }\n\n applyAlg(alg: Alg | string): KPattern {\n return this.applyTransformation(this.kpuzzle.algToTransformation(alg));\n }\n\n isIdentical(other: KPattern): boolean {\n return isPatternDataIdentical(\n this.kpuzzle,\n this.patternData,\n other.patternData,\n );\n }\n\n /** @deprecated */\n experimentalToTransformation(): KTransformation | null {\n if (!this.kpuzzle.canConvertDefaultPatternToUniqueTransformation()) {\n return null;\n }\n const transformationData: KTransformationData = {};\n for (const [orbitName, patternOrbitData] of Object.entries(\n this.patternData,\n )) {\n const transformationOrbit: KTransformationOrbitData = {\n permutation: patternOrbitData.pieces,\n orientationDelta: patternOrbitData.orientation,\n };\n transformationData[orbitName] = transformationOrbit;\n }\n return new KTransformation(this.kpuzzle, transformationData);\n }\n\n experimentalIsSolved(options: {\n ignorePuzzleOrientation: boolean;\n // Note: `ignoreCenterOrientation` must currently be specified even if the puzzle does not have centers with indistinguishable orientations (in which case the value will be ignored).\n ignoreCenterOrientation: boolean;\n }): boolean {\n if (!this.kpuzzle.definition.experimentalIsPatternSolved) {\n throw new Error(\n \"`KPattern.experimentalIsPatternSolved()` is not supported for this puzzle at the moment.\",\n );\n }\n return this.kpuzzle.definition.experimentalIsPatternSolved(this, options);\n }\n}\n", "import type { Alg, Move } from \"../alg\";\nimport {\n invertTransformation,\n isTransformationDataIdentical,\n repeatTransformationUncached,\n transformationRepetitionOrder,\n} from \"./calculate\";\nimport { combineTransformationData } from \"./combine\";\nimport { constructIdentityTransformationDataUncached } from \"./construct\";\nimport type { KPuzzle, KTransformationSource } from \"./KPuzzle\";\nimport type { KTransformationData } from \"./KPuzzleDefinition\";\nimport { KPattern } from \"./KPattern\";\n\nexport class KTransformation {\n constructor(\n public readonly kpuzzle: KPuzzle,\n public readonly transformationData: KTransformationData,\n ) {}\n\n toJSON(): any {\n return {\n experimentalPuzzleName: this.kpuzzle.name(),\n transformationData: this.transformationData,\n };\n }\n\n invert(): KTransformation {\n return new KTransformation(\n this.kpuzzle,\n invertTransformation(this.kpuzzle, this.transformationData),\n );\n }\n\n // For optimizations, we want to make it cheap to rely on optimizations when a\n // transformation is an identity. Here, we try to make it cheaper by:\n // - only calculating when needed, and\n // - caching the result.\n #cachedIsIdentity: boolean | undefined; // TODO: is `null` worse here?\n isIdentityTransformation(): boolean {\n return (this.#cachedIsIdentity ??= this.isIdentical(\n this.kpuzzle.identityTransformation(),\n ));\n }\n\n /** @deprecated */\n static experimentalConstructIdentity(kpuzzle: KPuzzle) {\n const transformation = new KTransformation(\n kpuzzle,\n constructIdentityTransformationDataUncached(kpuzzle.definition),\n );\n transformation.#cachedIsIdentity = true;\n return transformation;\n }\n\n isIdentical(t2: KTransformation): boolean {\n return isTransformationDataIdentical(\n this.kpuzzle,\n this.transformationData,\n t2.transformationData,\n );\n }\n\n // Convenience function\n /** @deprecated */\n apply(source: KTransformationSource): KTransformation {\n return this.applyTransformation(this.kpuzzle.toTransformation(source));\n }\n\n applyTransformation(t2: KTransformation): KTransformation {\n if (this.kpuzzle !== t2.kpuzzle) {\n throw new Error(\n `Tried to apply a transformation for a KPuzzle (${t2.kpuzzle.name()}) to a different KPuzzle (${this.kpuzzle.name()}).`,\n );\n }\n\n if (this.#cachedIsIdentity) {\n return new KTransformation(this.kpuzzle, t2.transformationData);\n }\n if (t2.#cachedIsIdentity) {\n return new KTransformation(this.kpuzzle, this.transformationData);\n }\n\n return new KTransformation(\n this.kpuzzle,\n combineTransformationData(\n this.kpuzzle.definition,\n this.transformationData,\n t2.transformationData,\n ),\n );\n }\n\n applyMove(move: Move | string): KTransformation {\n return this.applyTransformation(this.kpuzzle.moveToTransformation(move));\n }\n\n applyAlg(alg: Alg | string): KTransformation {\n return this.applyTransformation(this.kpuzzle.algToTransformation(alg));\n }\n\n // Convenience. Useful for chaining.\n toKPattern(): KPattern {\n return KPattern.fromTransformation(this);\n }\n\n // TODO: support calculating this for a given start state. (For `R U R' U` on 3x3x3, should this default to 5 or 10?)\n repetitionOrder(): number {\n return transformationRepetitionOrder(this.kpuzzle.definition, this);\n }\n\n selfMultiply(amount: number): KTransformation {\n return new KTransformation(\n this.kpuzzle,\n repeatTransformationUncached(\n this.kpuzzle,\n this.transformationData,\n amount,\n ),\n );\n }\n}\n", "import {\n functionFromTraversal,\n TraversalDownUp,\n type Alg,\n type Commutator,\n type Conjugate,\n type Grouping,\n type LineComment,\n type Move,\n type Newline,\n type Pause,\n} from \"../alg\";\nimport { combineTransformationData } from \"./combine\";\nimport type { KPuzzle } from \"./KPuzzle\";\nimport type {\n KPatternData,\n KPatternOrbitData,\n KPuzzleDefinition,\n KPuzzleOrbitDefinition,\n KTransformationData,\n KTransformationOrbitData,\n} from \"./KPuzzleDefinition\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport function isOrbitTransformationDataIdentityUncached(\n numOrientations: number,\n orbitTransformationData: KTransformationOrbitData,\n): boolean {\n // TODO\n // if (o === lasto) {\n // return true;\n // }\n if (!orbitTransformationData.permutation) {\n console.log(orbitTransformationData);\n }\n const { permutation } = orbitTransformationData;\n const numPieces = permutation.length;\n for (let idx = 0; idx < numPieces; idx++) {\n if (permutation[idx] !== idx) {\n return false;\n }\n }\n if (numOrientations > 1) {\n const { orientationDelta: orientation } = orbitTransformationData;\n for (let idx = 0; idx < numPieces; idx++) {\n if (orientation[idx] !== 0) {\n return false;\n }\n }\n }\n // lasto = o; // TODO\n return true;\n}\n\nexport function isOrbitTransformationDataIdentical(\n orbitDefinition: KPuzzleOrbitDefinition,\n orbitTransformationData1: KTransformationOrbitData,\n orbitTransformationData2: KTransformationOrbitData,\n options: {\n ignorePieceOrientations?: boolean;\n ignorePiecePermutation?: boolean;\n } = {},\n): boolean {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n if (\n !options?.ignorePieceOrientations &&\n orbitTransformationData1.orientationDelta[idx] !==\n orbitTransformationData2.orientationDelta[idx]\n ) {\n return false;\n }\n if (\n !options?.ignorePiecePermutation &&\n orbitTransformationData1.permutation[idx] !==\n orbitTransformationData2.permutation[idx]\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function isTransformationDataIdentical(\n kpuzzle: KPuzzle,\n transformationData1: KTransformationData,\n transformationData2: KTransformationData,\n): boolean {\n for (const orbitDefinition of kpuzzle.definition.orbits) {\n if (\n !isOrbitTransformationDataIdentical(\n orbitDefinition,\n transformationData1[orbitDefinition.orbitName],\n transformationData2[orbitDefinition.orbitName],\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction isOrbitPatternDataIdentical(\n orbitDefinition: KPuzzleOrbitDefinition,\n orbitPatternData1: KPatternOrbitData,\n orbitPatternData2: KPatternOrbitData,\n options: {\n ignorePieceOrientations?: boolean;\n ignorePieceIndices?: boolean;\n } = {},\n): boolean {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n if (\n !options?.ignorePieceOrientations &&\n (orbitPatternData1.orientation[idx] !==\n orbitPatternData2.orientation[idx] ||\n (orbitPatternData1.orientationMod?.[idx] ?? 0) !==\n (orbitPatternData2.orientationMod?.[idx] ?? 0))\n ) {\n return false;\n }\n if (\n !options?.ignorePieceIndices &&\n orbitPatternData1.pieces[idx] !== orbitPatternData2.pieces[idx]\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function isPatternDataIdentical(\n kpuzzle: KPuzzle,\n patternData1: KPatternData,\n patternData2: KPatternData,\n): boolean {\n for (const orbitDefinition of kpuzzle.definition.orbits) {\n if (\n !isOrbitPatternDataIdentical(\n orbitDefinition,\n patternData1[orbitDefinition.orbitName],\n patternData2[orbitDefinition.orbitName],\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function invertTransformation(\n kpuzzle: KPuzzle,\n transformationData: KTransformationData,\n): KTransformationData {\n const newTransformationData: KTransformationData = {};\n for (const orbitDefinition of kpuzzle.definition.orbits) {\n const orbitTransformationData =\n transformationData[orbitDefinition.orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbitTransformationData,\n )\n ) {\n newTransformationData[orbitDefinition.orbitName] =\n orbitTransformationData;\n } else if (orbitDefinition.numOrientations === 1) {\n const newPerm = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPerm[orbitTransformationData.permutation[idx]] = idx;\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: orbitTransformationData.orientationDelta,\n };\n } else {\n const newPerm = new Array(orbitDefinition.numPieces);\n const newOri = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n const fromIdx = orbitTransformationData.permutation[idx];\n newPerm[fromIdx] = idx;\n newOri[fromIdx] =\n (orbitDefinition.numOrientations -\n orbitTransformationData.orientationDelta[idx] +\n orbitDefinition.numOrientations) %\n orbitDefinition.numOrientations;\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: newOri,\n };\n }\n }\n return newTransformationData;\n}\n\nexport function repeatTransformationUncached(\n kpuzzle: KPuzzle,\n transformationData: KTransformationData,\n amount: number,\n): KTransformationData {\n // This is used for move construction, so we optimize for the quantum move case.\n if (amount === 1) {\n return transformationData;\n }\n if (amount < 0) {\n return repeatTransformationUncached(\n kpuzzle,\n invertTransformation(kpuzzle, transformationData),\n -amount,\n );\n }\n if (amount === 0) {\n // TODO\n const { transformationData } = kpuzzle.identityTransformation();\n return transformationData;\n }\n let halfish = transformationData;\n if (amount !== 2) {\n halfish = repeatTransformationUncached(\n kpuzzle,\n transformationData,\n Math.floor(amount / 2),\n );\n }\n const twiceHalfish = combineTransformationData(\n kpuzzle.definition,\n halfish,\n halfish,\n );\n if (amount % 2 === 0) {\n return twiceHalfish;\n } else {\n return combineTransformationData(\n kpuzzle.definition,\n transformationData,\n twiceHalfish,\n );\n }\n}\n\nclass AlgToTransformationTraversal extends TraversalDownUp<\n KPuzzle,\n KTransformation\n> {\n traverseAlg(alg: Alg, kpuzzle: KPuzzle): KTransformation {\n let transformation: KTransformation | null = null;\n for (const algNode of alg.childAlgNodes()) {\n if (transformation) {\n transformation = transformation.applyTransformation(\n this.traverseAlgNode(algNode, kpuzzle),\n );\n } else {\n transformation = this.traverseAlgNode(algNode, kpuzzle);\n }\n }\n return transformation ?? kpuzzle.identityTransformation();\n }\n traverseGrouping(grouping: Grouping, kpuzzle: KPuzzle): KTransformation {\n const algTransformation = this.traverseAlg(grouping.alg, kpuzzle);\n return new KTransformation(\n kpuzzle,\n repeatTransformationUncached(\n kpuzzle,\n algTransformation.transformationData,\n grouping.amount,\n ),\n );\n }\n traverseMove(move: Move, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.moveToTransformation(move);\n }\n traverseCommutator(\n commutator: Commutator,\n kpuzzle: KPuzzle,\n ): KTransformation {\n const aTransformation = this.traverseAlg(commutator.A, kpuzzle);\n const bTransformation = this.traverseAlg(commutator.B, kpuzzle);\n return aTransformation\n .applyTransformation(bTransformation)\n .applyTransformation(aTransformation.invert())\n .applyTransformation(bTransformation.invert());\n }\n traverseConjugate(conjugate: Conjugate, kpuzzle: KPuzzle): KTransformation {\n const aTransformation = this.traverseAlg(conjugate.A, kpuzzle);\n const bTransformation = this.traverseAlg(conjugate.B, kpuzzle);\n return aTransformation\n .applyTransformation(bTransformation)\n .applyTransformation(aTransformation.invert());\n }\n traversePause(_: Pause, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n traverseNewline(_: Newline, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n traverseLineComment(_: LineComment, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n}\n\nexport const algToTransformation = functionFromTraversal(\n AlgToTransformationTraversal,\n);\n\nexport function canConvertDefaultPatternToUniqueTransformationUncached(\n definition: KPuzzleDefinition,\n): boolean {\n for (const orbitDefinition of definition.orbits) {\n const pieces = new Array(orbitDefinition.numPieces).fill(false);\n for (const piece of this.definition.defaultPattern[\n orbitDefinition.orbitName\n ].pieces) {\n pieces[piece] = true;\n }\n for (const piece of pieces) {\n if (!piece) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction gcd(a: number, b: number): number {\n if (b) {\n return gcd(b, a % b);\n }\n return a;\n}\n\n/* calculate the order of a particular transformation. */\nexport function transformationRepetitionOrder(\n definition: KPuzzleDefinition,\n transformation: KTransformation,\n): number {\n let order: number = 1;\n for (const orbitDefinition of definition.orbits) {\n const transformationOrbit =\n transformation.transformationData[orbitDefinition.orbitName];\n const orbitPieces = new Array(orbitDefinition.numPieces);\n for (let startIdx = 0; startIdx < orbitDefinition.numPieces; startIdx++) {\n if (!orbitPieces[startIdx]) {\n let currentIdx = startIdx;\n let orientationSum = 0;\n let cycleLength = 0;\n for (;;) {\n orbitPieces[currentIdx] = true;\n orientationSum =\n orientationSum + transformationOrbit.orientationDelta[currentIdx];\n cycleLength = cycleLength + 1;\n currentIdx = transformationOrbit.permutation[currentIdx];\n if (currentIdx === startIdx) {\n break;\n }\n }\n if (orientationSum !== 0) {\n cycleLength =\n (cycleLength * orbitDefinition.numOrientations) /\n gcd(orbitDefinition.numOrientations, Math.abs(orientationSum));\n }\n order = (order * cycleLength) / gcd(order, cycleLength);\n }\n }\n }\n return order;\n}\n", "import { Alg, Move } from \"../alg\";\nimport type { PGNotation } from \"../puzzle-geometry/PuzzleGeometry\";\nimport { algToTransformation } from \"./calculate\";\nimport { moveToTransformationUncached } from \"./construct\";\nimport type {\n KPuzzleDefinition,\n KPuzzleOrbitDefinition,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\nimport { KPattern } from \"./KPattern\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport type KTransformationSource = Alg | Move | string | KTransformation;\n\nexport class KPuzzle {\n private experimentalPGNotation: PGNotation | undefined;\n constructor(\n public readonly definition: KPuzzleDefinition,\n options?: {\n experimentalPGNotation?: PGNotation;\n },\n ) {\n this.experimentalPGNotation = options?.experimentalPGNotation;\n }\n\n #indexedOrbits: Record<string, KPuzzleOrbitDefinition> | undefined;\n // Note: this function is needed much more rarely than you might think. Most\n // operations related to orbits require iterating through all of them, for\n // which the following is better:\n //\n // for (const orbitDefinition of kpuzzle.definition.orbits) { // \u2026\n // }\n lookupOrbitDefinition(orbitName: string): KPuzzleOrbitDefinition {\n this.#indexedOrbits ||= (() => {\n const indexedOrbits: Record<string, KPuzzleOrbitDefinition> = {};\n for (const orbitDefinition of this.definition.orbits) {\n indexedOrbits[orbitDefinition.orbitName] = orbitDefinition;\n }\n return indexedOrbits;\n })();\n return this.#indexedOrbits[orbitName];\n }\n\n name(): string {\n return this.definition.name; // TODO\n }\n\n identityTransformation(): KTransformation {\n return KTransformation.experimentalConstructIdentity(this);\n }\n\n #moveToTransformationDataCache = new Map<string, KTransformationData>();\n moveToTransformation(move: Move | string): KTransformation {\n if (typeof move === \"string\") {\n move = new Move(move);\n }\n const cacheKey = move.toString();\n const cachedTransformationData: KTransformationData | undefined =\n this.#moveToTransformationDataCache.get(cacheKey);\n if (cachedTransformationData) {\n return new KTransformation(this, cachedTransformationData);\n }\n\n if (this.experimentalPGNotation) {\n const transformationData = this.experimentalPGNotation.lookupMove(move);\n if (!transformationData) {\n throw new Error(`could not map to internal move: ${move}`);\n }\n this.#moveToTransformationDataCache.set(cacheKey, transformationData);\n return new KTransformation(this, transformationData);\n }\n\n const transformationData = moveToTransformationUncached(this, move);\n this.#moveToTransformationDataCache.set(cacheKey, transformationData);\n return new KTransformation(this, transformationData);\n }\n\n algToTransformation(alg: Alg | string): KTransformation {\n if (typeof alg === \"string\") {\n alg = new Alg(alg);\n }\n return algToTransformation(alg, this);\n }\n\n /** @deprecated */\n toTransformation(source: KTransformationSource): KTransformation {\n if (typeof source === \"string\") {\n return this.algToTransformation(source);\n } else if ((source as Alg | null)?.is?.(Alg)) {\n return this.algToTransformation(source as Alg);\n } else if ((source as Move | null)?.is?.(Move)) {\n return this.moveToTransformation(source as Move);\n } else {\n return source as KTransformation;\n }\n }\n\n defaultPattern(): KPattern {\n return new KPattern(this, this.definition.defaultPattern);\n }\n\n #cachedCanConvertDefaultPatternToUniqueTransformation: boolean | undefined;\n // TODO: Handle incomplete default pattern data\n canConvertDefaultPatternToUniqueTransformation(): boolean {\n return (this.#cachedCanConvertDefaultPatternToUniqueTransformation ??=\n ((): boolean => {\n for (const orbitDefinition of this.definition.orbits) {\n const pieces = new Array(orbitDefinition.numPieces).fill(false);\n for (const piece of this.definition.defaultPattern[\n orbitDefinition.orbitName\n ].pieces) {\n pieces[piece] = true;\n }\n for (const piece of pieces) {\n if (!piece) {\n return false;\n }\n }\n }\n return true;\n })());\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;AAQO,SAAS,0BACd,YACA,qBACA,qBACqB;AACrB,QAAM,wBAAwB,CAAC;AAC/B,aAAW,mBAAmB,WAAW,QAAQ;AAC/C,UAAM,SAAS,oBAAoB,gBAAgB,SAAS;AAC5D,UAAM,SAAS,oBAAoB,gBAAgB,SAAS;AAC5D,QACE;AAAA,MACE,gBAAgB;AAAA,MAChB;AAAA,IACF,GACA;AAEA,4BAAsB,gBAAgB,SAAS,IAAI;AAAA,IACrD,WACE;AAAA,MACE,gBAAgB;AAAA,MAChB;AAAA,IACF,GACA;AACA,4BAAsB,gBAAgB,SAAS,IAAI;AAAA,IACrD,OAAO;AACL,YAAM,UAAU,IAAI,MAAM,gBAAgB,SAAS;AACnD,UAAI,gBAAgB,oBAAoB,GAAG;AACzC,iBAAS,MAAM,GAAG,MAAM,gBAAgB,WAAW,OAAO;AACxD,kBAAQ,GAAG,IAAI,OAAO,YAAY,OAAO,YAAY,GAAG,CAAC;AAAA,QAC3D;AACA,8BAAsB,gBAAgB,SAAS,IAAI;AAAA,UACjD,aAAa;AAAA,UACb,kBAAkB,OAAO;AAAA,QAC3B;AAAA,MACF,OAAO;AACL,cAAM,SAAS,IAAI,MAAM,gBAAgB,SAAS;AAClD,iBAAS,MAAM,GAAG,MAAM,gBAAgB,WAAW,OAAO;AACxD,iBAAO,GAAG,KACP,OAAO,iBAAiB,OAAO,YAAY,GAAG,CAAC,IAC9C,OAAO,iBAAiB,GAAG,KAC7B,gBAAgB;AAClB,kBAAQ,GAAG,IAAI,OAAO,YAAY,OAAO,YAAY,GAAG,CAAC;AAAA,QAC3D;AACA,8BAAsB,gBAAgB,SAAS,IAAI;AAAA,UACjD,aAAa;AAAA,UACb,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,sCACd,YACA,aACA,oBACc;AACd,QAAM,iBAAiB,CAAC;AACxB,aAAW,mBAAmB,WAAW,QAAQ;AAC/C,UAAM,eAAe,YAAY,gBAAgB,SAAS;AAC1D,UAAM,sBAAsB,mBAAmB,gBAAgB,SAAS;AACxE,QACE;AAAA,MACE,gBAAgB;AAAA,MAChB;AAAA,IACF,GACA;AAEA,qBAAe,gBAAgB,SAAS,IAAI;AAAA,IAC9C,OAAO;AACL,YAAM,YAAY,IAAI,MAAM,gBAAgB,SAAS;AACrD,UAAI,gBAAgB,oBAAoB,GAAG;AACzC,iBAAS,MAAM,GAAG,MAAM,gBAAgB,WAAW,OAAO;AACxD,oBAAU,GAAG,IACX,aAAa,OAAO,oBAAoB,YAAY,GAAG,CAAC;AAAA,QAC5D;AACA,cAAM,eAAkC;AAAA,UACtC,QAAQ;AAAA,UACR,aAAa,aAAa;AAAA;AAAA,QAC5B;AACA,uBAAe,gBAAgB,SAAS,IAAI;AAAA,MAC9C,OAAO;AACL,cAAM,iBAAiB,IAAI,MAAM,gBAAgB,SAAS;AAC1D,cAAM,oBACJ,aAAa,iBACT,IAAI,MAAM,gBAAgB,SAAS,IACnC;AACN,iBAAS,MAAM,GAAG,MAAM,gBAAgB,WAAW,OAAO;AACxD,gBAAM,oBAAoB,oBAAoB,YAAY,GAAG;AAC7D,cAAI,MAAM,gBAAgB;AAC1B,cAAI,aAAa,gBAAgB;AAC/B,kBAAM,iBACJ,aAAa,eAAe,iBAAiB;AAC/C,8BAAmB,GAAG,IAAI;AAC1B,kBAAM,kBAAkB,gBAAgB;AAAA,UAC1C;AACA,yBAAe,GAAG,KACf,aAAa,YAAY,iBAAiB,IACzC,oBAAoB,iBAAiB,GAAG,KAC1C;AACF,oBAAU,GAAG,IAAI,aAAa,OAAO,iBAAiB;AAAA,QACxD;AACA,cAAM,eAAkC;AAAA,UACtC,QAAQ;AAAA,UACR,aAAa;AAAA,QACf;AACA,YAAI,mBAAmB;AACrB,uBAAa,iBAAiB;AAAA,QAChC;AACA,uBAAe,gBAAgB,SAAS,IAAI;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AClHA,IAAM,SAAkB;AAExB,IAAM,qBAAqB,oBAAI,IAAsC;AACrE,SAAS,qCACP,WAC0B;AAC1B,QAAM,SAAS,mBAAmB,IAAI,SAAS;AAC/C,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,IAAI,MAAM,SAAS;AAC1C,QAAM,iBAAiB,IAAI,MAAM,SAAS;AAC1C,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,mBAAe,CAAC,IAAI;AACpB,mBAAe,CAAC,IAAI;AAAA,EACtB;AACA,QAAM,sBAAsB;AAAA,IAC1B,aAAa;AAAA,IACb,kBAAkB;AAAA,EACpB;AACA,MAAI,QAAQ;AACV,WAAO,OAAO,cAAc;AAC5B,WAAO,OAAO,cAAc;AAC5B,WAAO,OAAO,mBAAmB;AAAA,EACnC;AACA,qBAAmB,IAAI,WAAW,mBAAmB;AACrD,SAAO;AACT;AAEO,SAAS,4CACd,YACqB;AACrB,QAAM,iBAAiB,CAAC;AACxB,aAAW,mBAAmB,WAAW,QAAQ;AAC/C,mBAAe,gBAAgB,SAAS,IACtC,qCAAqC,gBAAgB,SAAS;AAAA,EAClE;AACA,MAAI,QAAQ;AACV,WAAO,OAAO,cAAc;AAAA,EAC9B;AACA,SAAO;AACT;AAEO,SAAS,6BACd,SACA,MACqB;AACrB,WAAS,sBACP,KAGA,gBACiC;AACjC,UAAM,IAAI,IAAI,SAAS;AACvB,UAAM,WAAW,QAAQ,WAAW,MAAM,CAAC;AAC3C,QAAI,UAAU;AACZ,aAAO,6BAA6B,SAAS,UAAU,cAAc;AAAA,IACvE;AACA,UAAM,aAAa,QAAQ,WAAW,eAAe,CAAC;AACtD,QAAI,YAAY;AACd,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,oBAAoB,UAAU,EAAE;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAKA,QAAM,OACJ,sBAAsB,KAAK,SAAS,KAAK,MAAM;AAAA;AAAA,EAG/C,sBAAsB,MAAM,CAAC;AAAA;AAAA,EAG7B,sBAAsB,KAAK,QAAQ,EAAE;AAEvC,MAAI,MAAM;AACR,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,6BAA6B,QAAQ,KAAK,CAAC,MAAM,IAAI,EAAE;AACzE;;;ACpFO,IAAM,WAAN,MAAM,UAAS;AAAA,EACpB,YACkB,SACA,aAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAEH,SAAc;AACZ,WAAO;AAAA,MACL,wBAAwB,KAAK,QAAQ,KAAK;AAAA,MAC1C,aAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,OAAO,mBAAmB,gBAA2C;AACnE,UAAM,iBAAiB;AAAA,MACrB,eAAe,QAAQ;AAAA,MACvB,eAAe,QAAQ,WAAW;AAAA,MAClC,eAAe;AAAA,IACjB;AACA,WAAO,IAAI,UAAS,eAAe,SAAS,cAAc;AAAA,EAC5D;AAAA;AAAA;AAAA,EAIA,MAAM,QAAyC;AAC7C,WAAO,KAAK,oBAAoB,KAAK,QAAQ,iBAAiB,MAAM,CAAC;AAAA,EACvE;AAAA,EAEA,oBAAoB,gBAA2C;AAC7D,QAAI,eAAe,yBAAyB,GAAG;AAC7C,aAAO,IAAI,UAAS,KAAK,SAAS,KAAK,WAAW;AAAA,IACpD;AACA,UAAM,iBAAiB;AAAA,MACrB,KAAK,QAAQ;AAAA,MACb,KAAK;AAAA,MACL,eAAe;AAAA,IACjB;AACA,WAAO,IAAI,UAAS,KAAK,SAAS,cAAc;AAAA,EAClD;AAAA,EAEA,UAAU,MAA+B;AACvC,WAAO,KAAK,oBAAoB,KAAK,QAAQ,qBAAqB,IAAI,CAAC;AAAA,EACzE;AAAA,EAEA,SAAS,KAA6B;AACpC,WAAO,KAAK,oBAAoB,KAAK,QAAQ,oBAAoB,GAAG,CAAC;AAAA,EACvE;AAAA,EAEA,YAAY,OAA0B;AACpC,WAAO;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,+BAAuD;AACrD,QAAI,CAAC,KAAK,QAAQ,+CAA+C,GAAG;AAClE,aAAO;AAAA,IACT;AACA,UAAM,qBAA0C,CAAC;AACjD,eAAW,CAAC,WAAW,gBAAgB,KAAK,OAAO;AAAA,MACjD,KAAK;AAAA,IACP,GAAG;AACD,YAAM,sBAAgD;AAAA,QACpD,aAAa,iBAAiB;AAAA,QAC9B,kBAAkB,iBAAiB;AAAA,MACrC;AACA,yBAAmB,SAAS,IAAI;AAAA,IAClC;AACA,WAAO,IAAI,gBAAgB,KAAK,SAAS,kBAAkB;AAAA,EAC7D;AAAA,EAEA,qBAAqB,SAIT;AACV,QAAI,CAAC,KAAK,QAAQ,WAAW,6BAA6B;AACxD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,WAAW,4BAA4B,MAAM,OAAO;AAAA,EAC1E;AACF;;;ACpFO,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAC3B,YACkB,SACA,oBAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAEH,SAAc;AACZ,WAAO;AAAA,MACL,wBAAwB,KAAK,QAAQ,KAAK;AAAA,MAC1C,oBAAoB,KAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,SAA0B;AACxB,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL,qBAAqB,KAAK,SAAS,KAAK,kBAAkB;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA,EACA,2BAAoC;AAClC,WAAQ,KAAK,sBAAsB,KAAK;AAAA,MACtC,KAAK,QAAQ,uBAAuB;AAAA,IACtC;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,8BAA8B,SAAkB;AACrD,UAAM,iBAAiB,IAAI;AAAA,MACzB;AAAA,MACA,4CAA4C,QAAQ,UAAU;AAAA,IAChE;AACA,mBAAe,oBAAoB;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,IAA8B;AACxC,WAAO;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,MAAM,QAAgD;AACpD,WAAO,KAAK,oBAAoB,KAAK,QAAQ,iBAAiB,MAAM,CAAC;AAAA,EACvE;AAAA,EAEA,oBAAoB,IAAsC;AACxD,QAAI,KAAK,YAAY,GAAG,SAAS;AAC/B,YAAM,IAAI;AAAA,QACR,kDAAkD,GAAG,QAAQ,KAAK,CAAC,6BAA6B,KAAK,QAAQ,KAAK,CAAC;AAAA,MACrH;AAAA,IACF;AAEA,QAAI,KAAK,mBAAmB;AAC1B,aAAO,IAAI,iBAAgB,KAAK,SAAS,GAAG,kBAAkB;AAAA,IAChE;AACA,QAAI,GAAG,mBAAmB;AACxB,aAAO,IAAI,iBAAgB,KAAK,SAAS,KAAK,kBAAkB;AAAA,IAClE;AAEA,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL;AAAA,QACE,KAAK,QAAQ;AAAA,QACb,KAAK;AAAA,QACL,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,MAAsC;AAC9C,WAAO,KAAK,oBAAoB,KAAK,QAAQ,qBAAqB,IAAI,CAAC;AAAA,EACzE;AAAA,EAEA,SAAS,KAAoC;AAC3C,WAAO,KAAK,oBAAoB,KAAK,QAAQ,oBAAoB,GAAG,CAAC;AAAA,EACvE;AAAA;AAAA,EAGA,aAAuB;AACrB,WAAO,SAAS,mBAAmB,IAAI;AAAA,EACzC;AAAA;AAAA,EAGA,kBAA0B;AACxB,WAAO,8BAA8B,KAAK,QAAQ,YAAY,IAAI;AAAA,EACpE;AAAA,EAEA,aAAa,QAAiC;AAC5C,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL;AAAA,QACE,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AChGO,SAAS,0CACd,iBACA,yBACS;AAKT,MAAI,CAAC,wBAAwB,aAAa;AACxC,YAAQ,IAAI,uBAAuB;AAAA,EACrC;AACA,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,YAAY,YAAY;AAC9B,WAAS,MAAM,GAAG,MAAM,WAAW,OAAO;AACxC,QAAI,YAAY,GAAG,MAAM,KAAK;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,kBAAkB,GAAG;AACvB,UAAM,EAAE,kBAAkB,YAAY,IAAI;AAC1C,aAAS,MAAM,GAAG,MAAM,WAAW,OAAO;AACxC,UAAI,YAAY,GAAG,MAAM,GAAG;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mCACd,iBACA,0BACA,0BACA,UAGI,CAAC,GACI;AACT,WAAS,MAAM,GAAG,MAAM,gBAAgB,WAAW,OAAO;AACxD,QACE,CAAC,SAAS,2BACV,yBAAyB,iBAAiB,GAAG,MAC3C,yBAAyB,iBAAiB,GAAG,GAC/C;AACA,aAAO;AAAA,IACT;AACA,QACE,CAAC,SAAS,0BACV,yBAAyB,YAAY,GAAG,MACtC,yBAAyB,YAAY,GAAG,GAC1C;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,8BACd,SACA,qBACA,qBACS;AACT,aAAW,mBAAmB,QAAQ,WAAW,QAAQ;AACvD,QACE,CAAC;AAAA,MACC;AAAA,MACA,oBAAoB,gBAAgB,SAAS;AAAA,MAC7C,oBAAoB,gBAAgB,SAAS;AAAA,IAC/C,GACA;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,4BACP,iBACA,mBACA,mBACA,UAGI,CAAC,GACI;AACT,WAAS,MAAM,GAAG,MAAM,gBAAgB,WAAW,OAAO;AACxD,QACE,CAAC,SAAS,4BACT,kBAAkB,YAAY,GAAG,MAChC,kBAAkB,YAAY,GAAG,MAChC,kBAAkB,iBAAiB,GAAG,KAAK,QACzC,kBAAkB,iBAAiB,GAAG,KAAK,KAChD;AACA,aAAO;AAAA,IACT;AACA,QACE,CAAC,SAAS,sBACV,kBAAkB,OAAO,GAAG,MAAM,kBAAkB,OAAO,GAAG,GAC9D;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uBACd,SACA,cACA,cACS;AACT,aAAW,mBAAmB,QAAQ,WAAW,QAAQ;AACvD,QACE,CAAC;AAAA,MACC;AAAA,MACA,aAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa,gBAAgB,SAAS;AAAA,IACxC,GACA;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,qBACd,SACA,oBACqB;AACrB,QAAM,wBAA6C,CAAC;AACpD,aAAW,mBAAmB,QAAQ,WAAW,QAAQ;AACvD,UAAM,0BACJ,mBAAmB,gBAAgB,SAAS;AAC9C,QACE;AAAA,MACE,gBAAgB;AAAA,MAChB;AAAA,IACF,GACA;AACA,4BAAsB,gBAAgB,SAAS,IAC7C;AAAA,IACJ,WAAW,gBAAgB,oBAAoB,GAAG;AAChD,YAAM,UAAU,IAAI,MAAM,gBAAgB,SAAS;AACnD,eAAS,MAAM,GAAG,MAAM,gBAAgB,WAAW,OAAO;AACxD,gBAAQ,wBAAwB,YAAY,GAAG,CAAC,IAAI;AAAA,MACtD;AACA,4BAAsB,gBAAgB,SAAS,IAAI;AAAA,QACjD,aAAa;AAAA,QACb,kBAAkB,wBAAwB;AAAA,MAC5C;AAAA,IACF,OAAO;AACL,YAAM,UAAU,IAAI,MAAM,gBAAgB,SAAS;AACnD,YAAM,SAAS,IAAI,MAAM,gBAAgB,SAAS;AAClD,eAAS,MAAM,GAAG,MAAM,gBAAgB,WAAW,OAAO;AACxD,cAAM,UAAU,wBAAwB,YAAY,GAAG;AACvD,gBAAQ,OAAO,IAAI;AACnB,eAAO,OAAO,KACX,gBAAgB,kBACf,wBAAwB,iBAAiB,GAAG,IAC5C,gBAAgB,mBAClB,gBAAgB;AAAA,MACpB;AACA,4BAAsB,gBAAgB,SAAS,IAAI;AAAA,QACjD,aAAa;AAAA,QACb,kBAAkB;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,6BACd,SACA,oBACA,QACqB;AAErB,MAAI,WAAW,GAAG;AAChB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,MACL;AAAA,MACA,qBAAqB,SAAS,kBAAkB;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,WAAW,GAAG;AAEhB,UAAM,EAAE,oBAAAA,oBAAmB,IAAI,QAAQ,uBAAuB;AAC9D,WAAOA;AAAA,EACT;AACA,MAAI,UAAU;AACd,MAAI,WAAW,GAAG;AAChB,cAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA,KAAK,MAAM,SAAS,CAAC;AAAA,IACvB;AAAA,EACF;AACA,QAAM,eAAe;AAAA,IACnB,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACA,MAAI,SAAS,MAAM,GAAG;AACpB,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,+BAAN,cAA2C,gBAGzC;AAAA,EACA,YAAY,KAAU,SAAmC;AACvD,QAAI,iBAAyC;AAC7C,eAAW,WAAW,IAAI,cAAc,GAAG;AACzC,UAAI,gBAAgB;AAClB,yBAAiB,eAAe;AAAA,UAC9B,KAAK,gBAAgB,SAAS,OAAO;AAAA,QACvC;AAAA,MACF,OAAO;AACL,yBAAiB,KAAK,gBAAgB,SAAS,OAAO;AAAA,MACxD;AAAA,IACF;AACA,WAAO,kBAAkB,QAAQ,uBAAuB;AAAA,EAC1D;AAAA,EACA,iBAAiB,UAAoB,SAAmC;AACtE,UAAM,oBAAoB,KAAK,YAAY,SAAS,KAAK,OAAO;AAChE,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,QACA,kBAAkB;AAAA,QAClB,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA,aAAa,MAAY,SAAmC;AAC1D,WAAO,QAAQ,qBAAqB,IAAI;AAAA,EAC1C;AAAA,EACA,mBACE,YACA,SACiB;AACjB,UAAM,kBAAkB,KAAK,YAAY,WAAW,GAAG,OAAO;AAC9D,UAAM,kBAAkB,KAAK,YAAY,WAAW,GAAG,OAAO;AAC9D,WAAO,gBACJ,oBAAoB,eAAe,EACnC,oBAAoB,gBAAgB,OAAO,CAAC,EAC5C,oBAAoB,gBAAgB,OAAO,CAAC;AAAA,EACjD;AAAA,EACA,kBAAkB,WAAsB,SAAmC;AACzE,UAAM,kBAAkB,KAAK,YAAY,UAAU,GAAG,OAAO;AAC7D,UAAM,kBAAkB,KAAK,YAAY,UAAU,GAAG,OAAO;AAC7D,WAAO,gBACJ,oBAAoB,eAAe,EACnC,oBAAoB,gBAAgB,OAAO,CAAC;AAAA,EACjD;AAAA,EACA,cAAc,GAAU,SAAmC;AACzD,WAAO,QAAQ,uBAAuB;AAAA,EACxC;AAAA,EACA,gBAAgB,GAAY,SAAmC;AAC7D,WAAO,QAAQ,uBAAuB;AAAA,EACxC;AAAA,EACA,oBAAoB,GAAgB,SAAmC;AACrE,WAAO,QAAQ,uBAAuB;AAAA,EACxC;AACF;AAEO,IAAM,sBAAsB;AAAA,EACjC;AACF;AAqBA,SAAS,IAAI,GAAW,GAAmB;AACzC,MAAI,GAAG;AACL,WAAO,IAAI,GAAG,IAAI,CAAC;AAAA,EACrB;AACA,SAAO;AACT;AAGO,SAAS,8BACd,YACA,gBACQ;AACR,MAAI,QAAgB;AACpB,aAAW,mBAAmB,WAAW,QAAQ;AAC/C,UAAM,sBACJ,eAAe,mBAAmB,gBAAgB,SAAS;AAC7D,UAAM,cAAc,IAAI,MAAM,gBAAgB,SAAS;AACvD,aAAS,WAAW,GAAG,WAAW,gBAAgB,WAAW,YAAY;AACvE,UAAI,CAAC,YAAY,QAAQ,GAAG;AAC1B,YAAI,aAAa;AACjB,YAAI,iBAAiB;AACrB,YAAI,cAAc;AAClB,mBAAS;AACP,sBAAY,UAAU,IAAI;AAC1B,2BACE,iBAAiB,oBAAoB,iBAAiB,UAAU;AAClE,wBAAc,cAAc;AAC5B,uBAAa,oBAAoB,YAAY,UAAU;AACvD,cAAI,eAAe,UAAU;AAC3B;AAAA,UACF;AAAA,QACF;AACA,YAAI,mBAAmB,GAAG;AACxB,wBACG,cAAc,gBAAgB,kBAC/B,IAAI,gBAAgB,iBAAiB,KAAK,IAAI,cAAc,CAAC;AAAA,QACjE;AACA,gBAAS,QAAQ,cAAe,IAAI,OAAO,WAAW;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC/VO,IAAM,UAAN,MAAc;AAAA,EAEnB,YACkB,YAChB,SAGA;AAJgB;AAKhB,SAAK,yBAAyB,SAAS;AAAA,EACzC;AAAA,EARQ;AAAA,EAUR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsB,WAA2C;AAC/D,SAAK,oBAAoB,MAAM;AAC7B,YAAM,gBAAwD,CAAC;AAC/D,iBAAW,mBAAmB,KAAK,WAAW,QAAQ;AACpD,sBAAc,gBAAgB,SAAS,IAAI;AAAA,MAC7C;AACA,aAAO;AAAA,IACT,GAAG;AACH,WAAO,KAAK,eAAe,SAAS;AAAA,EACtC;AAAA,EAEA,OAAe;AACb,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,yBAA0C;AACxC,WAAO,gBAAgB,8BAA8B,IAAI;AAAA,EAC3D;AAAA,EAEA,iCAAiC,oBAAI,IAAiC;AAAA,EACtE,qBAAqB,MAAsC;AACzD,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,IAAI,KAAK,IAAI;AAAA,IACtB;AACA,UAAM,WAAW,KAAK,SAAS;AAC/B,UAAM,2BACJ,KAAK,+BAA+B,IAAI,QAAQ;AAClD,QAAI,0BAA0B;AAC5B,aAAO,IAAI,gBAAgB,MAAM,wBAAwB;AAAA,IAC3D;AAEA,QAAI,KAAK,wBAAwB;AAC/B,YAAMC,sBAAqB,KAAK,uBAAuB,WAAW,IAAI;AACtE,UAAI,CAACA,qBAAoB;AACvB,cAAM,IAAI,MAAM,mCAAmC,IAAI,EAAE;AAAA,MAC3D;AACA,WAAK,+BAA+B,IAAI,UAAUA,mBAAkB;AACpE,aAAO,IAAI,gBAAgB,MAAMA,mBAAkB;AAAA,IACrD;AAEA,UAAM,qBAAqB,6BAA6B,MAAM,IAAI;AAClE,SAAK,+BAA+B,IAAI,UAAU,kBAAkB;AACpE,WAAO,IAAI,gBAAgB,MAAM,kBAAkB;AAAA,EACrD;AAAA,EAEA,oBAAoB,KAAoC;AACtD,QAAI,OAAO,QAAQ,UAAU;AAC3B,YAAM,IAAI,IAAI,GAAG;AAAA,IACnB;AACA,WAAO,oBAAoB,KAAK,IAAI;AAAA,EACtC;AAAA;AAAA,EAGA,iBAAiB,QAAgD;AAC/D,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO,KAAK,oBAAoB,MAAM;AAAA,IACxC,WAAY,QAAuB,KAAK,GAAG,GAAG;AAC5C,aAAO,KAAK,oBAAoB,MAAa;AAAA,IAC/C,WAAY,QAAwB,KAAK,IAAI,GAAG;AAC9C,aAAO,KAAK,qBAAqB,MAAc;AAAA,IACjD,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,iBAA2B;AACzB,WAAO,IAAI,SAAS,MAAM,KAAK,WAAW,cAAc;AAAA,EAC1D;AAAA,EAEA;AAAA;AAAA,EAEA,iDAA0D;AACxD,WAAQ,KAAK,2DACV,MAAe;AACd,iBAAW,mBAAmB,KAAK,WAAW,QAAQ;AACpD,cAAM,SAAS,IAAI,MAAM,gBAAgB,SAAS,EAAE,KAAK,KAAK;AAC9D,mBAAW,SAAS,KAAK,WAAW,eAClC,gBAAgB,SAClB,EAAE,QAAQ;AACR,iBAAO,KAAK,IAAI;AAAA,QAClB;AACA,mBAAW,SAAS,QAAQ;AAC1B,cAAI,CAAC,OAAO;AACV,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG;AAAA,EACP;AACF;",
|
|
6
|
-
"names": ["transformationData", "transformationData"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/twisty/debug.ts", "../../../../src/cubing/twisty/model/PromiseFreshener.ts", "../../../../src/cubing/twisty/model/props/TwistyProp.ts", "../../../../src/cubing/twisty/controllers/RenderScheduler.ts", "../../../../src/cubing/twisty/model/props/puzzle/display/HintFaceletProp.ts", "../../../../src/cubing/twisty/views/3D/TAU.ts", "../../../../src/cubing/twisty/views/node-custom-element-shims.ts", "../../../../src/cubing/twisty/views/ManagedCustomElement.ts", "../../../../src/cubing/vendor/mit/three/examples/jsm/libs/stats.modified.module.ts", "../../../../src/cubing/twisty/heavy-code-imports/3d.ts", "../../../../src/cubing/twisty/views/canvas.ts", "../../../../src/cubing/twisty/views/3D/Twisty3DVantage.css.ts", "../../../../src/cubing/twisty/views/3D/DragTracker.ts", "../../../../src/cubing/twisty/views/3D/RendererPool.ts", "../../../../src/cubing/twisty/views/3D/TwistyOrbitControls.ts", "../../../../src/cubing/twisty/views/3D/Twisty3DVantage.ts"],
|
|
4
|
-
"sourcesContent": ["export const twistyDebugGlobals: {\n // WARNING: The current shared renderer implementation has performance issues, especially in Safari.\n // Avoid using for players that are likely to have dimensions approaching 1 megapixel or higher.\n // TODO: use a dedicated renderer while fullscreen?\n // - \"auto\": Default heuristics.\n // - \"always\": Force all new (i.e. constructed in the future) renderers to be shared\n // - \"never\": Force all new (i.e. constructed in the future) renderers to be dedicated\n shareAllNewRenderers: \"auto\" | \"always\" | \"never\";\n showRenderStats: boolean;\n} = {\n shareAllNewRenderers: \"auto\",\n showRenderStats: false,\n};\n\nexport function setTwistyDebug(\n options: Partial<typeof twistyDebugGlobals>,\n): void {\n for (const [key, value] of Object.entries(options)) {\n if (key in twistyDebugGlobals) {\n (twistyDebugGlobals as any)[key] = value;\n }\n }\n}\n", "// TODO: Pick a much better name.\nexport class PromiseFreshener<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n // TODO: reject instead? Drop?\n async queue(\n p: Promise<T>,\n ): Promise<{ fresh: false } | { fresh: true; result: T }> {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n return {\n fresh: true,\n result: result,\n };\n } else {\n return { fresh: false };\n }\n }\n}\n\n// This will silenty drop a queued Promise (i.e. not resolve it) if a\n// newer queued one already resolved first. This is useful for classes that want\n// to know the \"latest\" state of something without jumping back to an older\n// value by accident.\n// TODO: Remove this because it's too easy to misuse?\nexport class StaleDropper<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n queue(p: Promise<T>): Promise<T> {\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: This is a very rare case where we *do* want to drop a Promise sometimes.\n return new Promise(async (resolve, reject) => {\n try {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n resolve(result);\n }\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n", "import { from } from \"../../../vendor/mit/p-lazy/p-lazy\";\nimport { StaleDropper } from \"../PromiseFreshener\";\nimport type { UserVisibleErrorTracker } from \"../UserVisibleErrorTracker\";\n\ntype InputRecord = Record<string, any>;\n\nexport type InputProps<T extends InputRecord> = {\n [s in keyof T]: TwistyPropParent<T[s]>;\n};\n\ntype InputPromises<T extends InputRecord> = {\n [s in keyof T]: Promise<T[s]>;\n};\n\ninterface SourceEventDetail<OutputType> {\n sourceProp: TwistyPropSource<OutputType, any>;\n value: Promise<OutputType>; // TODO: remove?\n generation: number;\n}\n\ntype SourceEvent<T> = CustomEvent<SourceEventDetail<T>>;\n\nexport type PromiseOrValue<T> = T | Promise<T>;\n\n// Values of T must be immutable.\nlet globalSourceGeneration = 0; // This is incremented before being used, so 1 will be the first active value.\nexport abstract class TwistyPropParent<T> {\n public abstract get(): Promise<T>;\n\n // Don't overwrite this. Overwrite `canReuseValue` instead.\n public canReuse(v1: T, v2: T): boolean {\n return v1 === v2 || this.canReuseValue(v1, v2);\n }\n\n // Overwrite with a cheap semantic comparison when possible.\n // Note that this is not called if `v1 === v2` (in which case the value is automatically reused).\n protected canReuseValue(_v1: T, _v2: T): boolean {\n return false;\n }\n\n debugGetChildren(): TwistyPropDerived<any, any>[] {\n return Array.from(this.#children.values());\n }\n\n // Propagation\n\n #children: Set<TwistyPropDerived<any, any>> = new Set();\n protected addChild(child: TwistyPropDerived<any, any>): void {\n this.#children.add(child);\n }\n\n protected removeChild(child: TwistyPropDerived<any, any>): void {\n this.#children.delete(child);\n }\n\n protected lastSourceGeneration: number = 0;\n // Synchronously marks all descendants as stale. This doesn't actually\n // literally mark as stale, but it updates the last source generation, which\n // is used to tell if a cahced result is stale.\n protected markStale(sourceEvent: SourceEvent<any>): void {\n if (sourceEvent.detail.generation !== globalSourceGeneration) {\n // The full stale propagation is synchronous, so there should not be a new one yet.\n throw new Error(\"A TwistyProp was marked stale too late!\");\n }\n if (this.lastSourceGeneration === sourceEvent.detail.generation) {\n // Already propagated.\n return;\n }\n this.lastSourceGeneration = sourceEvent.detail.generation;\n for (const child of this.#children) {\n child.markStale(sourceEvent);\n }\n // We schedule sending out events *after* the (synchronous) propagation has happened, in\n // case one of the listeners updates a source again.\n this.#scheduleRawDispatch();\n }\n\n #rawListeners: Set<() => void> = new Set();\n /** @deprecated */\n addRawListener(listener: () => void, options?: { initial: boolean }): void {\n this.#rawListeners.add(listener);\n if (options?.initial) {\n listener(); // TODO: wrap in a try?\n }\n }\n\n /** @deprecated */\n removeRawListener(listener: () => void): void {\n this.#rawListeners.delete(listener);\n }\n\n /** @deprecated */\n #scheduleRawDispatch(): void {\n if (!this.#rawDispatchPending) {\n this.#rawDispatchPending = true;\n setTimeout(() => this.#dispatchRawListeners(), 0);\n }\n }\n\n #rawDispatchPending: boolean = false;\n #dispatchRawListeners(): void {\n if (!this.#rawDispatchPending) {\n throw new Error(\"Invalid dispatch state!\");\n }\n for (const listener of this.#rawListeners) {\n listener(); // TODO: wrap in a try?\n }\n this.#rawDispatchPending = false;\n }\n\n #freshListeners: Map<(value: T) => void, () => void> = new Map();\n // TODO: Pick a better name.\n public addFreshListener(listener: (value: T) => void): void {\n const staleDropper: StaleDropper<T> = new StaleDropper<T>();\n let lastResult: T | null = null;\n const callback = async () => {\n const result = await staleDropper.queue(this.get());\n if (lastResult !== null && this.canReuse(lastResult, result)) {\n return;\n }\n lastResult = result;\n listener(result);\n };\n this.#freshListeners.set(listener, callback);\n this.addRawListener(callback, { initial: true });\n }\n\n public removeFreshListener(listener: (value: T) => void): void {\n this.removeRawListener(this.#freshListeners.get(listener)!); // TODO: throw a custom error?\n this.#freshListeners.delete(listener);\n }\n}\n\nexport abstract class TwistyPropSource<\n OutputType,\n InputType = OutputType,\n> extends TwistyPropParent<OutputType> {\n #value: Promise<OutputType>;\n\n public abstract getDefaultValue(): PromiseOrValue<OutputType>;\n\n constructor(initialValue?: PromiseOrValue<InputType>) {\n super();\n this.#value = from(() => this.getDefaultValue());\n if (initialValue) {\n this.#value = this.deriveFromPromiseOrValue(initialValue, this.#value);\n }\n }\n\n set(input: PromiseOrValue<InputType>): void {\n this.#value = this.deriveFromPromiseOrValue(input, this.#value);\n\n const sourceEventDetail: SourceEventDetail<OutputType> = {\n sourceProp: this,\n value: this.#value,\n generation: ++globalSourceGeneration,\n };\n this.markStale(\n new CustomEvent<SourceEventDetail<OutputType>>(\"stale\", {\n detail: sourceEventDetail,\n }),\n );\n }\n\n async get(): Promise<OutputType> {\n return this.#value;\n }\n\n protected async deriveFromPromiseOrValue(\n input: PromiseOrValue<InputType>,\n oldValuePromise: Promise<OutputType>,\n ): Promise<OutputType> {\n return this.derive(await input, oldValuePromise);\n }\n\n // TODO: add an indirect layer to cache the derivation?\n protected abstract derive(\n input: InputType,\n oldValuePromise: Promise<OutputType>,\n ): PromiseOrValue<OutputType>;\n}\n\nexport abstract class SimpleTwistyPropSource<\n SimpleType,\n> extends TwistyPropSource<SimpleType> {\n protected override derive(input: SimpleType): PromiseOrValue<SimpleType> {\n return input;\n }\n}\n\n// TODO: Can we support `null` as a valid output value without loosening type\n// safety?\nexport const NO_VALUE = Symbol(\"no value\");\nexport type NoValueType = typeof NO_VALUE;\n\nexport abstract class TwistyPropDerived<\n InputTypes extends InputRecord,\n OutputType,\n> extends TwistyPropParent<OutputType> {\n // cachedInputs:\n #parents: InputProps<InputTypes>;\n\n constructor(\n parents: InputProps<InputTypes>,\n protected userVisibleErrorTracker?: UserVisibleErrorTracker,\n ) {\n super();\n this.#parents = parents;\n for (const parent of Object.values(parents)) {\n (\n parent as TwistyPropDerived<InputProps<InputTypes>, OutputType>\n ).addChild(this);\n }\n }\n\n #cachedLastSuccessfulCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n #cachedLatestGenerationCalculation: {\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n public async get(): Promise<OutputType> {\n const generation = this.lastSourceGeneration;\n\n if (this.#cachedLatestGenerationCalculation?.generation === generation) {\n return this.#cachedLatestGenerationCalculation.output;\n }\n\n const latestGenerationCalculation = {\n generation,\n output: this.#cacheDerive(\n this.#getParents(),\n generation,\n this.#cachedLastSuccessfulCalculation,\n ),\n };\n this.#cachedLatestGenerationCalculation = latestGenerationCalculation;\n\n this.userVisibleErrorTracker?.reset();\n return latestGenerationCalculation.output;\n }\n\n async #getParents(): Promise<InputTypes> {\n const inputValuePromises: InputPromises<InputRecord> = {} as any; // TODO\n for (const [key, parent] of Object.entries(this.#parents)) {\n (inputValuePromises as Record<string, Promise<unknown>>)[key] = (\n parent as TwistyPropParent<unknown>\n ).get();\n }\n\n const inputs: InputTypes = {} as any; // TODO\n for (const key in this.#parents) {\n inputs[key] = (await (\n inputValuePromises as Record<string, Promise<unknown>>\n )[key]) as any;\n }\n return inputs;\n }\n\n async #cacheDerive(\n inputsPromise: PromiseOrValue<InputTypes>,\n generation: number,\n cachedLatestGenerationCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null,\n ): Promise<OutputType> {\n const inputs = await inputsPromise;\n\n const cache = (output: OutputType): OutputType => {\n this.#cachedLastSuccessfulCalculation = {\n inputs,\n output: Promise.resolve(output),\n generation,\n };\n return output;\n };\n\n if (!cachedLatestGenerationCalculation) {\n return cache(await this.derive(inputs));\n }\n\n const cachedInputs = cachedLatestGenerationCalculation.inputs;\n for (const key in this.#parents) {\n const parent = this.#parents[key];\n if (!parent.canReuse(inputs[key], cachedInputs[key])) {\n return cache(await this.derive(inputs));\n }\n }\n\n return cachedLatestGenerationCalculation.output;\n }\n\n protected abstract derive(input: InputTypes): PromiseOrValue<OutputType>;\n}\n\nexport class FreshListenerManager {\n #disconnectionFunctions: (() => void)[] = [];\n\n addListener<T>(\n prop: TwistyPropParent<T>,\n listener: (value: T) => void,\n ): void {\n let disconnected = false;\n const wrappedListener = (value: T) => {\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n listener(value);\n };\n\n prop.addFreshListener(wrappedListener);\n\n this.#disconnectionFunctions.push(() => {\n prop.removeFreshListener(wrappedListener);\n disconnected = true;\n });\n }\n\n // TODO: Figure out the signature to let us do overloads\n /** @deprecated */\n public addMultiListener3<U, V, W>(\n props: [TwistyPropParent<U>, TwistyPropParent<V>, TwistyPropParent<W>],\n listener: (values: [U, V, W]) => void,\n ): void {\n this.addMultiListener(props as any, listener as any); // TODO\n }\n public addMultiListener<U, V>(\n props: [TwistyPropParent<U>, TwistyPropParent<V>],\n listener: (values: [U, V]) => void,\n ) {\n let disconnected = false;\n\n // We're going to get one initial call per prop. We'll ignore all but one.\n let initialIgnoresLeft = props.length - 1;\n const wrappedListener = async (_: any) => {\n if (initialIgnoresLeft > 0) {\n initialIgnoresLeft--;\n return;\n }\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n // We rely on `TwistyProp` caching to give us the full set of latest\n // values efficiently.\n const promises = (props as TwistyPropParent<any>[]).map((prop) =>\n prop.get(),\n );\n const values = await Promise.all(promises);\n listener(values as any); // TODO: fix up types\n };\n\n for (const prop of props) {\n prop.addFreshListener(wrappedListener);\n }\n\n this.#disconnectionFunctions.push(() => {\n for (const prop of props) {\n prop.removeFreshListener(wrappedListener);\n }\n disconnected = true;\n });\n }\n\n public disconnect(): void {\n for (const disconnectionFunction of this.#disconnectionFunctions) {\n disconnectionFunction();\n }\n }\n}\n", "// Debounces `requestAnimationFrame()`.\nexport class RenderScheduler {\n private animFrameID: number | null = null;\n private animFrame = this.animFrameWrapper.bind(this);\n constructor(private callback: (timestamp: DOMHighResTimeStamp) => void) {}\n\n requestIsPending(): boolean {\n return !!this.animFrameID;\n }\n\n requestAnimFrame(): void {\n if (!this.animFrameID) {\n this.animFrameID = requestAnimationFrame(this.animFrame);\n }\n }\n\n cancelAnimFrame(): void {\n if (this.animFrameID) {\n cancelAnimationFrame(this.animFrameID);\n this.animFrameID = 0;\n }\n }\n\n private animFrameWrapper(timestamp: DOMHighResTimeStamp): void {\n this.animFrameID = 0;\n this.callback(timestamp);\n }\n}\n\n// An interface for classes to use to expose their scheduling.\nexport interface Schedulable {\n scheduleRender(): void;\n}\n", "import { SimpleTwistyPropSource } from \"../../TwistyProp\";\n\n// TODO: turn these maps into lists?\nexport const hintFaceletStyles = {\n floating: true, // default\n none: true,\n};\nexport type HintFaceletStyle = keyof typeof hintFaceletStyles;\nexport type HintFaceletStyleWithAuto = HintFaceletStyle | \"auto\";\n\nexport class HintFaceletProp extends SimpleTwistyPropSource<HintFaceletStyleWithAuto> {\n getDefaultValue(): HintFaceletStyleWithAuto {\n return \"auto\";\n }\n}\n", "export const TAU = Math.PI * 2;\nexport const DEGREES_PER_RADIAN = 360 / TAU;\n", "// Workarounds for `node`.\n// TODO: figure out how to remove this.\n\n// This stub does not need to be callable, just constructable to satisfy the `node` loader.\nclass HTMLElementStub {}\n\nlet HTMLElementShim: typeof HTMLElement;\nif (globalThis.HTMLElement) {\n HTMLElementShim = globalThis.HTMLElement;\n} else {\n HTMLElementShim = HTMLElementStub as any;\n}\n\nexport { HTMLElementShim };\n\nclass CustomElementsStub {\n define(): void {\n // nothing\n }\n}\n\nlet customElementsShim: typeof customElements;\n\nif (globalThis.customElements) {\n customElementsShim = globalThis.customElements;\n} else {\n customElementsShim = new CustomElementsStub() as any;\n}\n\nexport { customElementsShim };\n\nlet cssStyleSheetShim: typeof CSSStyleSheet;\n\nclass CSSStyleSheetStub {\n replaceSync(): void {\n // nothing\n }\n}\n\nif (globalThis.CSSStyleSheet) {\n cssStyleSheetShim = globalThis.CSSStyleSheet;\n} else {\n cssStyleSheetShim = CSSStyleSheetStub as any;\n}\n\nexport { cssStyleSheetShim };\n", "import {\n HTMLElementShim,\n customElementsShim,\n} from \"./node-custom-element-shims\";\n\n// - Wrapped element\n// - Shadow root\n// - Content wrapper\nexport class ManagedCustomElement extends HTMLElementShim {\n public readonly shadow: ShadowRoot; // TODO: hide this\n public readonly contentWrapper: HTMLDivElement; // TODO: can we get rid of this wrapper?\n\n constructor(options?: { mode?: \"open\" | \"closed\" }) {\n super();\n this.shadow = this.attachShadow({ mode: options?.mode ?? \"closed\" });\n\n this.contentWrapper = document.createElement(\"div\");\n this.contentWrapper.classList.add(\"wrapper\");\n this.shadow.appendChild(this.contentWrapper);\n }\n\n // Add the source, if not already added.\n // Returns the existing if it's already on the element.\n protected addCSS(cssSource: CSSStyleSheet): void {\n this.shadow.adoptedStyleSheets.push(cssSource);\n }\n\n protected removeCSS(cssSource: CSSStyleSheet) {\n const cssIndex = this.shadow.adoptedStyleSheets.indexOf(cssSource);\n if (typeof cssIndex !== \"undefined\") {\n this.shadow.adoptedStyleSheets.splice(cssIndex, cssIndex + 1);\n }\n }\n\n public addElement<T extends Node>(element: T): T {\n return this.contentWrapper.appendChild(element);\n }\n\n public prependElement<T extends Node>(element: T): void {\n this.contentWrapper.prepend(element);\n }\n\n public removeElement<T extends Node>(element: T): T {\n return this.contentWrapper.removeChild(element);\n }\n}\n\ncustomElementsShim.define(\n \"twisty-managed-custom-element\",\n ManagedCustomElement,\n);\n", "/**\n * @author mrdoob / http://mrdoob.com/\n * ESM conversion by Lucas Garron, 2021-12-21\n */\n\nconst performance:\n | null\n | (Performance & {\n memory?: {\n usedJSHeapSize: number;\n jsHeapSizeLimit: number;\n };\n }) = globalThis.performance;\n\nexport class Stats {\n mode = 0;\n\n dom = document.createElement(\"div\");\n\n constructor() {\n this.dom.style.cssText =\n \"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\";\n this.dom.addEventListener(\n \"click\",\n (event) => {\n event.preventDefault();\n this.showPanel(++this.mode % this.dom.children.length);\n },\n false,\n );\n\n this.showPanel(0);\n }\n\n addPanel(panel: StatsPanel): StatsPanel {\n this.dom.appendChild(panel.dom);\n return panel;\n }\n\n showPanel(id: number): void {\n for (let i = 0; i < this.dom.children.length; i++) {\n (this.dom.children[i] as HTMLElement).style.display =\n i === id ? \"block\" : \"none\";\n }\n\n this.mode = id;\n }\n\n beginTime = (performance || Date).now();\n prevTime = this.beginTime;\n frames = 0;\n\n fpsPanel = this.addPanel(new StatsPanel(\"FPS\", \"#0ff\", \"#002\"));\n msPanel = this.addPanel(new StatsPanel(\"MS\", \"#0f0\", \"#020\"));\n memPanel = performance?.memory\n ? this.addPanel(new StatsPanel(\"MB\", \"#f08\", \"#201\"))\n : null;\n REVISION = 16;\n\n begin() {\n this.beginTime = (performance || Date).now();\n }\n\n end() {\n this.frames++;\n\n const time = (performance || Date).now();\n\n this.msPanel.update(time - this.beginTime, 200);\n\n if (time >= this.prevTime + 1000) {\n this.fpsPanel.update((this.frames * 1000) / (time - this.prevTime), 100);\n\n this.prevTime = time;\n this.frames = 0;\n\n if (this.memPanel) {\n const memory = performance!.memory!;\n this.memPanel.update(\n memory.usedJSHeapSize / 1048576,\n memory.jsHeapSizeLimit / 1048576,\n );\n }\n }\n\n return time;\n }\n\n update() {\n this.beginTime = this.end();\n }\n}\n\nconst PR = Math.round(globalThis?.window?.devicePixelRatio ?? 1);\n\nconst WIDTH = 80 * PR;\nconst HEIGHT = 48 * PR;\nconst TEXT_X = 3 * PR;\nconst TEXT_Y = 2 * PR;\nconst GRAPH_X = 3 * PR;\nconst GRAPH_Y = 15 * PR;\nconst GRAPH_WIDTH = 74 * PR;\nconst GRAPH_HEIGHT = 30 * PR;\n\nexport class StatsPanel {\n min = Infinity;\n max = 0;\n dom = document.createElement(\"canvas\");\n context = this.dom.getContext(\"2d\")!;\n constructor(\n private name: string,\n private fg: string,\n private bg: string,\n ) {\n this.dom.width = WIDTH;\n this.dom.height = HEIGHT;\n this.dom.style.cssText = \"width:80px;height:48px\";\n\n this.context.font = `bold ${9 * PR}px Helvetica,Arial,sans-serif`;\n this.context.textBaseline = \"top\";\n\n this.context.fillStyle = bg;\n this.context.fillRect(0, 0, WIDTH, HEIGHT);\n\n this.context.fillStyle = fg;\n this.context.fillText(name, TEXT_X, TEXT_Y);\n this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n\n this.context.fillStyle = bg;\n this.context.globalAlpha = 0.9;\n this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n }\n\n update(value: number, maxValue: number) {\n this.min = Math.min(this.min, value);\n this.max = Math.max(this.max, value);\n\n this.context.fillStyle = this.bg;\n this.context.globalAlpha = 1;\n this.context.fillRect(0, 0, WIDTH, GRAPH_Y);\n this.context.fillStyle = this.fg;\n this.context.fillText(\n `${Math.round(value)} ${this.name} (${Math.round(this.min)}-${Math.round(\n this.max,\n )})`,\n TEXT_X,\n TEXT_Y,\n );\n\n this.context.drawImage(\n this.dom,\n GRAPH_X + PR,\n GRAPH_Y,\n GRAPH_WIDTH - PR,\n GRAPH_HEIGHT,\n GRAPH_X,\n GRAPH_Y,\n GRAPH_WIDTH - PR,\n GRAPH_HEIGHT,\n );\n\n this.context.fillRect(\n GRAPH_X + GRAPH_WIDTH - PR,\n GRAPH_Y,\n PR,\n GRAPH_HEIGHT,\n );\n\n this.context.fillStyle = this.bg;\n this.context.globalAlpha = 0.9;\n this.context.fillRect(\n GRAPH_X + GRAPH_WIDTH - PR,\n GRAPH_Y,\n PR,\n Math.round((1 - value / maxValue) * GRAPH_HEIGHT),\n );\n }\n}\n", "import { from } from \"../../vendor/mit/p-lazy/p-lazy\";\n\n// TODO can we remove the cached proxy?\n\n// In theory we can, but we've run into situations where imports are not properly cached.\nlet cachedConstructorProxy: Promise<\n typeof import(\"./dynamic-entries/twisty-dynamic-3d\")\n> | null = null;\n\nexport async function proxy3D(): Promise<\n typeof import(\"./dynamic-entries/twisty-dynamic-3d\")\n> {\n return (cachedConstructorProxy ??= import(\n \"./dynamic-entries/twisty-dynamic-3d\"\n ));\n}\n\nexport const THREEJS: Promise<typeof import(\"three\")> = from(\n async () => (await proxy3D()).T3I,\n);\n", "let globalPixelRatioOverride: number | null = null;\nexport function setGlobalPixelRatioOverride(override: number | null): void {\n globalPixelRatioOverride = override;\n}\n\n// TODO: Handle if you move across screens?\nexport function pixelRatio(): number {\n return globalPixelRatioOverride ?? (devicePixelRatio || 1);\n}\n", "// The `position` values are a hack for a bug in Safari where the canvas either\n// grows infinitely, or takes up the full `fr` of any encompassing grid (making\n// the contents of that element e.g. over 100% of its height). `contain:\n// content` is a good fix for this, but there is no indication that Safari will\n// support it soon. https://developer.mozilla.org/en-US/docs/Web/CSS/contain\n\nimport { cssStyleSheetShim } from \"../node-custom-element-shims\";\n\nexport const twisty3DVantageCSS = new cssStyleSheetShim();\ntwisty3DVantageCSS.replaceSync(\n `\n:host {\n width: 384px;\n height: 256px;\n display: grid;\n}\n\n.wrapper {\n width: 100%;\n height: 100%;\n display: grid;\n overflow: hidden;\n place-content: center;\n contain: strict;\n}\n\n.loading {\n width: 4em;\n height: 4em;\n border-radius: 2.5em;\n border: 0.5em solid rgba(0, 0, 0, 0);\n border-top: 0.5em solid rgba(0, 0, 0, 0.7);\n border-right: 0.5em solid rgba(0, 0, 0, 0.7);\n animation: fade-in-delayed 4s, rotate 1s linear infinite;\n}\n\n@keyframes fade-in-delayed {\n 0% { opacity: 0; }\n 25% {opacity: 0; }\n 100% { opacity: 1; }\n}\n\n@keyframes rotate {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* TODO: This is due to stats hack. Replace with \\`canvas\\`. */\n.wrapper > canvas {\n max-width: 100%;\n max-height: 100%;\n animation: fade-in 0.25s ease-in;\n}\n\n@keyframes fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.wrapper.invisible {\n opacity: 0;\n}\n\n.wrapper.drag-input-enabled > canvas {\n cursor: grab;\n}\n\n.wrapper.drag-input-enabled > canvas:active {\n cursor: grabbing;\n}\n`,\n);\n", "// export class Drag() {\n\n// }\n\ninterface DragInfo {\n attachedInfo: Record<any, any>;\n hasMoved: boolean;\n lastClientX: number;\n lastClientY: number;\n lastTimeStamp: number;\n}\n\ntype PointerID = number;\n\nexport interface DragMovementInfo {\n attachedInfo: Record<any, any>;\n movementX: number;\n movementY: number;\n elapsedMs: number;\n}\n\nexport interface UpInfo {\n attachedInfo: Record<any, any>;\n}\n\nexport interface PressInfo {\n normalizedX: number;\n normalizedY: number;\n rightClick: boolean;\n keys: {\n // TODO: group these\n altKey: boolean;\n ctrlOrMetaKey: boolean;\n shiftKey: boolean;\n };\n}\n\n// Chrome can report movements as low as `0.0000152587890625` even if the cursor did not move at all. So we need a treshold insteadl.\nconst MOVEMENT_EPSILON = 0.1; // px\n\nexport class DragTracker extends EventTarget {\n #dragInfoMap: Map<PointerID, DragInfo> = new Map();\n\n constructor(public readonly target: HTMLElement) {\n super();\n }\n\n // Idempotent\n start() {\n this.addTargetListener(\"pointerdown\", this.onPointerDown.bind(this));\n // Prevent right-click on desktop (only tested on macOS Chrome/Safari/Firefox) so we can detect right-click moves.\n // TODO: Can we do this selectively, e.g. only on the puzzle? That way we could allow right-click to download the canvas. Unfortunately, it would probably require a sync calculation.\n this.addTargetListener(\"contextmenu\", (e) => {\n e.preventDefault();\n });\n // Prevent touch scrolling (preventing default on `pointermove` doesn't work).\n this.addTargetListener(\"touchmove\", (e) => e.preventDefault());\n // Prevent zooming on double-tap (iOS).\n // This is because `dblclick` works to zoom in, but does *not* work to zoom out. So the user can get stuck zoomed into the player without a way to zoom out.\n this.addTargetListener(\"dblclick\", (e) => e.preventDefault());\n }\n\n // Idempotent\n stop(): void {\n for (const [eventType, listener] of this.#targetListeners.entries()) {\n this.target.removeEventListener(eventType, listener);\n }\n this.#targetListeners.clear();\n this.#lazyListenersRegistered = false;\n }\n\n #targetListeners = new Map<string, (e: MouseEvent) => any>();\n addTargetListener(eventType: string, listener: (e: MouseEvent) => any) {\n if (!this.#targetListeners.has(eventType)) {\n this.target.addEventListener(eventType, listener);\n this.#targetListeners.set(eventType, listener);\n }\n }\n\n // This allows us to avoid getting a callback every time the pointer moves over the canvas, until we have a down event.\n // TODO: Ideally we'd also support unregistering when we're certain there are no more active touches. But this means we need to properly handle every way a pointer \"click\" can end, which is tricky across environments (due to e.g. mouse vs. touch vs. stylues, canvas/viewport/window/scroll boundaries, right-click and other ways of losing focus, etc.), so we conservatively leave the listeners on.\n #lazyListenersRegistered: boolean = false;\n #registerLazyListeners(): void {\n if (this.#lazyListenersRegistered) {\n return;\n }\n this.addTargetListener(\"pointermove\", this.onPointerMove.bind(this)); // TODO: only register this after pointer down.\n this.addTargetListener(\"pointerup\", this.onPointerUp.bind(this));\n this.#lazyListenersRegistered = true;\n }\n\n #clear(e: PointerEvent): void {\n this.#dragInfoMap.delete(e.pointerId);\n }\n\n // `null`: means: ignore this result (no movement, or not\n #trackDrag(e: PointerEvent): {\n movementInfo: DragMovementInfo | null;\n hasMoved: boolean;\n } {\n // TODO: Find a way to detect if this is an active press, in a way that works cross-platform.\n // if (e.buttons === 0) {\n // return { movementInfo: null, hasMoved: false };\n // }\n const existing = this.#dragInfoMap.get(e.pointerId);\n if (!existing) {\n return { movementInfo: null, hasMoved: false };\n }\n // We would try to use `e.movementX`/`e.movementY`, except Safari:\n // - Does not have those values on i[Pad]OS.\n // - Will always report `0` for these values on macOS.\n // https://bugs.webkit.org/show_bug.cgi?id=220194\n //\n // The following are all insufficiently powerful for detecting the Safari `0` bug:\n // - `\"movementX\" in e`\n // - `e.movementX !== \"undefined\"`\n // - `e.hasOwnProperty(\"movementX\")`\n\n let movementInfo: DragMovementInfo;\n if ((e.movementX ?? 0) !== 0 || (e.movementY ?? 0) !== 0) {\n // We optimistically try to catch sub-pixel movements in Chrome.\n movementInfo = {\n attachedInfo: existing.attachedInfo,\n movementX: e.movementX,\n movementY: e.movementY,\n elapsedMs: e.timeStamp - existing.lastTimeStamp,\n };\n } else {\n movementInfo = {\n attachedInfo: existing.attachedInfo,\n movementX: e.clientX - existing.lastClientX,\n movementY: e.clientY - existing.lastClientY,\n elapsedMs: e.timeStamp - existing.lastTimeStamp,\n };\n }\n existing.lastClientX = e.clientX;\n existing.lastClientY = e.clientY;\n existing.lastTimeStamp = e.timeStamp;\n if (\n Math.abs(movementInfo.movementX) < MOVEMENT_EPSILON &&\n Math.abs(movementInfo.movementY) < MOVEMENT_EPSILON\n ) {\n return { movementInfo: null, hasMoved: existing.hasMoved };\n } else {\n existing.hasMoved = true;\n return { movementInfo, hasMoved: existing.hasMoved };\n }\n }\n\n private onPointerDown(e: PointerEvent) {\n this.#registerLazyListeners();\n const newDragInfo: DragInfo = {\n attachedInfo: {},\n hasMoved: false,\n lastClientX: e.clientX,\n lastClientY: e.clientY,\n lastTimeStamp: e.timeStamp,\n };\n this.#dragInfoMap.set(e.pointerId, newDragInfo);\n this.target.setPointerCapture(e.pointerId);\n }\n\n private onPointerMove(e: PointerEvent) {\n const movementInfo = this.#trackDrag(e).movementInfo;\n if (movementInfo) {\n e.preventDefault();\n this.dispatchEvent(\n new CustomEvent(\"move\", {\n detail: movementInfo,\n }),\n );\n }\n }\n\n private onPointerUp(e: PointerEvent) {\n const trackDragResult = this.#trackDrag(e);\n const existing = this.#dragInfoMap.get(e.pointerId)!; // TODO\n this.#clear(e);\n this.target.releasePointerCapture(e.pointerId); // TODO: unnecessary?\n let event: CustomEvent;\n if (trackDragResult.hasMoved) {\n // TODO: send proper movement/momentum since last move event.\n event = new CustomEvent<UpInfo>(\"up\", {\n detail: { attachedInfo: existing.attachedInfo },\n });\n } else {\n const { altKey, ctrlKey, metaKey, shiftKey } = e;\n event = new CustomEvent<PressInfo>(\"press\", {\n detail: {\n normalizedX: (e.offsetX / this.target.offsetWidth) * 2 - 1,\n normalizedY: 1 - (e.offsetY / this.target.offsetHeight) * 2,\n rightClick: !!(e.button & 2),\n keys: {\n altKey,\n ctrlOrMetaKey: ctrlKey || metaKey,\n shiftKey,\n },\n },\n });\n }\n this.dispatchEvent(event);\n }\n}\n", "// TODO: https://stackoverflow.com/a/40443642\n\n// let shareAllNewRenderers: boolean = false;\n\n// // WARNING: The current shared renderer implementation is not every efficient.\n// // Avoid using for players that are likely to have dimensions approaching 1 megapixel or higher.\n// // TODO: use a dedicated renderer while fullscreen?\n// export function experimentalSetShareAllNewRenderers(share: boolean): void {\n// shareAllNewRenderers = share;\n// }\n\n// const sharedRenderer: WebGLRenderer | null = null;\n\nimport { THREEJS } from \"../../heavy-code-imports/3d\";\nimport {\n type Camera,\n type Scene,\n type WebGLRenderer,\n LinearSRGBColorSpace,\n} from \"three\";\nimport { pixelRatio } from \"../canvas\";\n\nconst renderers: Promise<WebGLRenderer>[] = [];\n\n// Render result is guaranteed to be available synchronously at resolution time.\nexport async function rawRenderPooled(\n width: number,\n height: number,\n scene: Scene,\n camera: Camera,\n): Promise<HTMLCanvasElement> {\n // At most one in the pool for now.\n if (renderers.length === 0) {\n renderers.push(newRenderer());\n }\n const renderer = await renderers[0];\n // TODO: scissoring\n renderer.setSize(width, height); // TODO: is it faster if we cache values and only call this when necessary?\n renderer.render(scene, camera);\n\n return renderer.domElement;\n}\n\n// let haveSet = false;\nexport async function renderPooled(\n width: number,\n height: number,\n canvas: HTMLCanvasElement,\n scene: Scene,\n camera: Camera,\n): Promise<void> {\n if (width === 0 || height === 0) {\n return;\n }\n // At most one in the pool for now.\n if (renderers.length === 0) {\n renderers.push(newRenderer());\n }\n\n const rendererCanvas = await rawRenderPooled(width, height, scene, camera);\n\n // TODO: Should we cache this? Seems to take about 0.0001ms to get.\n const context = canvas.getContext(\"2d\")!;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.drawImage(rendererCanvas, 0, 0);\n}\n\nexport async function newRenderer(): Promise<WebGLRenderer> {\n const rendererConstructor = (await THREEJS).WebGLRenderer;\n const renderer = new rendererConstructor({\n antialias: true,\n alpha: true,\n });\n renderer.outputColorSpace = LinearSRGBColorSpace; // TODO(https://github.com/cubing/cubing.js/issues/308): remove this\n renderer.setPixelRatio(pixelRatio());\n return renderer;\n}\n", "import type { Vector3 } from \"three\";\nimport { RenderScheduler } from \"../../controllers/RenderScheduler\";\nimport { THREEJS } from \"../../heavy-code-imports/3d\";\nimport type { OrbitCoordinates } from \"../../model/props/viewer/OrbitCoordinatesRequestProp\";\nimport type { TwistyPlayerModel } from \"../../model/TwistyPlayerModel\";\nimport type { DragMovementInfo, DragTracker } from \"./DragTracker\";\nimport { DEGREES_PER_RADIAN } from \"./TAU\";\n\nconst INERTIA_DEFAULT: boolean = true;\n\nconst INERTIA_DURATION_MS = 500;\n// If the first inertial render is this long after the last move, we assume the\n// user has halted the cursor and we consider inertia to have \"timed out\". We\n// never begin animating the inertia.\nconst INERTIA_TIMEOUT_MS = 50;\n\nconst VERTICAL_MOVEMENT_BASE_SCALE = 0.75;\n\n// progress is from 0 to 1.\nfunction momentumScale(progress: number) {\n // This is the exponential curve flipped so that\n // - The slope at progress = 0 is 1 (this corresponds to \"x = 1\" on the normal\n // curve).\n // - The scale exponentially \"decays\" until progress = 1.\n // This means the scale at the end will be about 0.418\n return (Math.exp(1 - progress) - (1 - progress)) / (1 - Math.E) + 1;\n}\n\nclass Inertia {\n private scheduler = new RenderScheduler(this.render.bind(this));\n private lastTimestamp: number;\n constructor(\n private startTimestamp: number,\n private momentumX: number,\n private momentumY: number,\n private callback: (movementX: number, movementY: number) => void,\n ) {\n this.scheduler.requestAnimFrame();\n this.lastTimestamp = startTimestamp;\n }\n\n private render(now: DOMHighResTimeStamp) {\n const progressBefore =\n (this.lastTimestamp - this.startTimestamp) / INERTIA_DURATION_MS;\n const progressAfter = Math.min(\n 1,\n (now - this.startTimestamp) / INERTIA_DURATION_MS,\n );\n\n if (\n progressBefore === 0 &&\n progressAfter > INERTIA_TIMEOUT_MS / INERTIA_DURATION_MS\n ) {\n // The user has already paused for a while. Don't start any inertia.\n return;\n }\n\n const delta = momentumScale(progressAfter) - momentumScale(progressBefore);\n\n // TODO: For now, we only carry horizontal momentum. If this should stay, we\n // can remove the plumbing for the Y dimension.\n this.callback(this.momentumX * delta * 1000, this.momentumY * delta * 1000);\n\n if (progressAfter < 1) {\n this.scheduler.requestAnimFrame();\n }\n this.lastTimestamp = now;\n }\n}\n\nexport async function positionToOrbitCoordinates(\n position: Vector3,\n): Promise<OrbitCoordinates> {\n const spherical = new (await THREEJS).Spherical();\n spherical.setFromVector3(position);\n return {\n latitude: 90 - spherical.phi * DEGREES_PER_RADIAN,\n longitude: spherical.theta * DEGREES_PER_RADIAN,\n distance: spherical.radius,\n };\n}\n\ninterface TwistyOrbitControlsDragAttachedInfo {\n lastTemperedX: number;\n lastTemperedY: number;\n timestamp: number;\n}\n\n// TODO: change mouse cursor while moving.\nexport class TwistyOrbitControls {\n /** @deprecated */\n experimentalInertia: boolean = INERTIA_DEFAULT;\n private onMovementBound = this.onMovement.bind(this);\n public experimentalHasBeenMoved: boolean = false;\n constructor(\n private model: TwistyPlayerModel,\n private mirror: boolean,\n private canvas: HTMLCanvasElement,\n private dragTracker: DragTracker,\n ) {\n this.dragTracker.addEventListener(\"move\", this.onMove.bind(this));\n this.dragTracker.addEventListener(\"up\", this.onUp.bind(this));\n }\n\n // f is the fraction of the canvas traversed per ms.\n temperMovement(f: number): number {\n // This is scaled to be linear for small values, but to reduce large values\n // by a significant factor.\n return (Math.sign(f) * Math.log(Math.abs(f * 10) + 1)) / 6;\n }\n\n onMove(e: CustomEvent<DragMovementInfo>): void {\n e.detail.attachedInfo ??= {};\n\n const { temperedX, temperedY } = this.onMovement(\n e.detail.movementX,\n e.detail.movementY,\n );\n const attachedInfo = e.detail\n .attachedInfo as TwistyOrbitControlsDragAttachedInfo;\n attachedInfo.lastTemperedX = temperedX * 10;\n attachedInfo.lastTemperedY = temperedY * 10;\n attachedInfo.timestamp = e.timeStamp; // TODO\n }\n\n onMovement(\n movementX: number,\n movementY: number,\n ): {\n temperedX: number;\n temperedY: number;\n } {\n const scale = this.mirror ? -1 : 1;\n\n // TODO: refactor\n const minDim = Math.min(this.canvas.offsetWidth, this.canvas.offsetHeight);\n\n const temperedX = this.temperMovement(movementX / minDim);\n const temperedY = this.temperMovement(\n (movementY / minDim) * VERTICAL_MOVEMENT_BASE_SCALE,\n );\n this.model.twistySceneModel.orbitCoordinatesRequest.set(\n (async () => {\n const prevCoords =\n await this.model.twistySceneModel.orbitCoordinates.get();\n\n const newCoords = {\n latitude:\n prevCoords.latitude + 2 * temperedY * DEGREES_PER_RADIAN * scale,\n longitude: prevCoords.longitude - 2 * temperedX * DEGREES_PER_RADIAN,\n };\n return newCoords;\n })(),\n );\n return { temperedX, temperedY };\n }\n\n onUp(e: CustomEvent<DragMovementInfo>): void {\n e.preventDefault();\n if (\n \"lastTemperedX\" in e.detail.attachedInfo &&\n \"lastTemperedY\" in e.detail.attachedInfo &&\n \"timestamp\" in e.detail.attachedInfo &&\n e.timeStamp - e.detail.attachedInfo.timestamp < 60 // TODO\n ) {\n new Inertia(\n e.timeStamp, // TODO\n (e.detail.attachedInfo as TwistyOrbitControlsDragAttachedInfo)\n .lastTemperedX,\n (e.detail.attachedInfo as TwistyOrbitControlsDragAttachedInfo)\n .lastTemperedY,\n this.onMovementBound,\n ); // TODO: cancel inertia\n }\n }\n}\n", "import type { PerspectiveCamera, WebGLRenderer } from \"three\";\nimport { Stats } from \"../../../vendor/mit/three/examples/jsm/libs/stats.modified.module\";\nimport { THREEJS } from \"../../heavy-code-imports/3d\";\nimport { StaleDropper } from \"../../model/PromiseFreshener\";\nimport type { TwistyPropParent } from \"../../model/props/TwistyProp\";\nimport type { OrbitCoordinates } from \"../../model/props/viewer/OrbitCoordinatesRequestProp\";\nimport type { TwistyPlayerModel } from \"../../model/TwistyPlayerModel\";\nimport { RenderScheduler } from \"../../controllers/RenderScheduler\";\nimport { ManagedCustomElement } from \"../ManagedCustomElement\";\nimport { customElementsShim } from \"../node-custom-element-shims\";\nimport { pixelRatio } from \"../canvas\";\nimport { twisty3DVantageCSS } from \"./Twisty3DVantage.css\";\nimport { DragTracker, type PressInfo } from \"./DragTracker\";\nimport { newRenderer, renderPooled } from \"./RendererPool\";\nimport { DEGREES_PER_RADIAN } from \"./TAU\";\nimport type { Twisty3DSceneWrapper } from \"./Twisty3DSceneWrapper\";\nimport { TwistyOrbitControls } from \"./TwistyOrbitControls\";\nimport type { DragInputMode } from \"../../model/props/puzzle/state/DragInputProp\";\nimport { twistyDebugGlobals } from \"../../debug\";\n\nexport async function setCameraFromOrbitCoordinates(\n camera: PerspectiveCamera,\n orbitCoordinates: OrbitCoordinates,\n backView: boolean = false,\n): Promise<void> {\n const spherical = new (await THREEJS).Spherical(\n orbitCoordinates.distance,\n (90 - (backView ? -1 : 1) * orbitCoordinates.latitude) / DEGREES_PER_RADIAN,\n ((backView ? 180 : 0) + orbitCoordinates.longitude) / DEGREES_PER_RADIAN,\n );\n spherical.makeSafe();\n camera.position.setFromSpherical(spherical);\n camera.lookAt(0, 0, 0);\n}\n\nlet dedicatedRenderersSoFar = 0;\nconst DEFAULT_MAX_DEDICATED_RENDERERS = 2; // This allows for a front view and a back view (or two separate front views).\nlet sharingRenderers = false;\nfunction shareRenderer(): boolean {\n if (twistyDebugGlobals.shareAllNewRenderers !== \"auto\") {\n if (!twistyDebugGlobals.shareAllNewRenderers) {\n dedicatedRenderersSoFar++;\n }\n return twistyDebugGlobals.shareAllNewRenderers !== \"never\";\n }\n if (dedicatedRenderersSoFar < DEFAULT_MAX_DEDICATED_RENDERERS) {\n dedicatedRenderersSoFar++;\n return false;\n } else {\n sharingRenderers = true;\n return true;\n }\n}\n\nexport function haveStartedSharingRenderers(): boolean {\n return sharingRenderers;\n}\n\nexport class Twisty3DVantage extends ManagedCustomElement {\n scene: Twisty3DSceneWrapper | null = null;\n\n stats: Stats | null = null;\n\n private rendererIsShared: boolean = shareRenderer();\n\n loadingElement: HTMLDivElement | null = null;\n constructor(\n private model?: TwistyPlayerModel,\n scene?: Twisty3DSceneWrapper,\n private options?: { backView?: boolean },\n ) {\n super();\n this.scene = scene ?? null;\n\n this.loadingElement = this.addElement(document.createElement(\"div\"));\n this.loadingElement.classList.add(\"loading\");\n\n if (twistyDebugGlobals.showRenderStats) {\n this.stats = new Stats();\n this.stats.dom.style.position = \"absolute\";\n this.contentWrapper.appendChild(this.stats.dom);\n }\n }\n\n async connectedCallback(): Promise<void> {\n this.addCSS(twisty3DVantageCSS);\n this.addElement((await this.canvasInfo()).canvas);\n\n this.#onResize();\n const observer = new ResizeObserver(this.#onResize.bind(this));\n observer.observe(this.contentWrapper);\n this.orbitControls(); // Instantiate orbit controls\n this.#setupBasicPresses();\n\n this.scheduleRender();\n }\n\n async #setupBasicPresses(): Promise<void> {\n const dragTracker = await this.#dragTracker();\n dragTracker.addEventListener(\"press\", async (e: CustomEvent<PressInfo>) => {\n const movePressInput =\n await this.model!.twistySceneModel.movePressInput.get();\n if (movePressInput !== \"basic\") {\n return;\n }\n this.dispatchEvent(\n new CustomEvent(\"press\", {\n detail: {\n pressInfo: e.detail,\n cameraPromise: this.camera(),\n },\n }),\n );\n });\n }\n\n #onResizeStaleDropper = new StaleDropper<PerspectiveCamera>();\n\n async clearCanvas(): Promise<void> {\n if (this.rendererIsShared) {\n const canvasInfo = await this.canvasInfo();\n canvasInfo.context.clearRect(\n 0,\n 0,\n canvasInfo.canvas.width,\n canvasInfo.canvas.height,\n );\n } else {\n const renderer = await this.renderer();\n const context = renderer.getContext();\n context.clear(context.COLOR_BUFFER_BIT);\n }\n }\n\n // TODO: Why doesn't this work for the top-right back view height?\n #width: number = 0;\n #height: number = 0;\n async #onResize(): Promise<void> {\n const camera = await this.#onResizeStaleDropper.queue(this.camera());\n\n const w = this.contentWrapper.clientWidth;\n const h = this.contentWrapper.clientHeight;\n this.#width = w;\n this.#height = h;\n const off = 0;\n let yoff = 0;\n let excess = 0;\n if (h > w) {\n excess = h - w;\n yoff = -Math.floor(0.5 * excess);\n }\n camera.aspect = w / h;\n camera.setViewOffset(w, h - excess, off, yoff, w, h);\n camera.updateProjectionMatrix(); // TODO\n\n this.clearCanvas();\n if (this.rendererIsShared) {\n const canvasInfo = await this.canvasInfo();\n\n canvasInfo.canvas.width = w * pixelRatio();\n canvasInfo.canvas.height = h * pixelRatio();\n canvasInfo.canvas.style.width = `${w.toString()}px`;\n canvasInfo.canvas.style.height = `${h.toString()}px`;\n } else {\n const renderer = await this.renderer();\n renderer.setSize(w, h, true);\n }\n\n this.scheduleRender();\n }\n\n #cachedRenderer: Promise<WebGLRenderer> | null = null;\n async renderer(): Promise<WebGLRenderer> {\n if (this.rendererIsShared) {\n throw new Error(\"renderer expected to be shared.\");\n }\n return (this.#cachedRenderer ??= newRenderer());\n }\n\n #cachedCanvas: Promise<{\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n }> | null = null;\n async canvasInfo(): Promise<{\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n }> {\n return (this.#cachedCanvas ??= (async () => {\n let canvas: HTMLCanvasElement;\n if (this.rendererIsShared) {\n canvas = this.addElement(document.createElement(\"canvas\"));\n } else {\n const renderer = await this.renderer();\n canvas = this.addElement(renderer.domElement);\n }\n this.loadingElement?.remove();\n const context = canvas.getContext(\"2d\")!;\n return { canvas, context };\n })());\n }\n\n #cachedDragTracker: Promise<DragTracker> | null = null;\n async #dragTracker(): Promise<DragTracker> {\n return (this.#cachedDragTracker ??= (async () => {\n const dragTracker = new DragTracker((await this.canvasInfo()).canvas);\n this.model?.twistySceneModel.dragInput.addFreshListener(\n (dragInputMode: DragInputMode) => {\n let dragInputEnabled = false;\n switch (dragInputMode) {\n case \"auto\": {\n dragTracker.start();\n dragInputEnabled = true;\n break;\n }\n case \"none\": {\n dragTracker.stop();\n break;\n }\n }\n this.contentWrapper.classList.toggle(\n \"drag-input-enabled\",\n dragInputEnabled,\n );\n },\n );\n return dragTracker;\n })());\n }\n\n #cachedCamera: Promise<PerspectiveCamera> | null = null;\n async camera(): Promise<PerspectiveCamera> {\n return (this.#cachedCamera ??= (async () => {\n const camera = new (await THREEJS).PerspectiveCamera(\n 20,\n 1, // We rely on the resize logic to handle this.\n 0.1,\n 20,\n );\n camera.position.copy(\n new (await THREEJS).Vector3(2, 4, 4).multiplyScalar(\n this.options?.backView ? -1 : 1,\n ),\n );\n camera.lookAt(0, 0, 0);\n // TODO: `TwistyOrbitControls` breaks isolateion\n return camera;\n })());\n }\n\n #cachedOrbitControls: Promise<TwistyOrbitControls> | null = null;\n async orbitControls(): Promise<TwistyOrbitControls> {\n return (this.#cachedOrbitControls ??= (async () => {\n const orbitControls = new TwistyOrbitControls(\n this.model!,\n !!this.options?.backView,\n (await this.canvasInfo()).canvas,\n await this.#dragTracker(),\n );\n\n if (this.model) {\n this.addListener(\n this.model.twistySceneModel.orbitCoordinates,\n async (orbitCoordinates: OrbitCoordinates) => {\n const camera = await this.camera();\n setCameraFromOrbitCoordinates(\n camera,\n orbitCoordinates,\n this.options?.backView,\n );\n // TODO: Wrap in StaleDropper?\n\n this.scheduleRender();\n },\n );\n }\n\n return orbitControls;\n })());\n }\n\n addListener<T>(\n prop: TwistyPropParent<T>,\n listener: (value: T) => void,\n ): void {\n prop.addFreshListener(listener);\n this.#disconnectionFunctions.push(() => {\n prop.removeFreshListener(listener);\n // disconnected = true; // TODO\n });\n }\n\n #disconnectionFunctions: (() => void)[] = [];\n disconnect(): void {\n for (const fn of this.#disconnectionFunctions) {\n fn();\n }\n this.#disconnectionFunctions = []; // TODO: Encapsulate this.\n }\n\n #experimentalNextRenderFinishedCallback: (() => void) | null = null;\n experimentalNextRenderFinishedCallback(callback: () => void): void {\n this.#experimentalNextRenderFinishedCallback = callback;\n }\n\n async render(): Promise<void> {\n if (!this.scene) {\n throw new Error(\"Attempted to render without a scene\");\n }\n\n this.stats?.begin();\n\n const [scene, camera, canvas] = await Promise.all([\n this.scene.scene(),\n this.camera(),\n this.canvasInfo(),\n ]);\n if (this.rendererIsShared) {\n renderPooled(this.#width, this.#height, canvas.canvas, scene, camera);\n } else {\n (await this.renderer()).render(scene, camera);\n }\n\n this.stats?.end();\n this.#experimentalNextRenderFinishedCallback?.();\n this.#experimentalNextRenderFinishedCallback = null;\n }\n\n #scheduler = new RenderScheduler(this.render.bind(this));\n scheduleRender(): void {\n // console.log(\"scheduling\", this);\n this.#scheduler.requestAnimFrame();\n }\n}\n\ncustomElementsShim.define(\"twisty-3d-vantage\", Twisty3DVantage);\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/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"],
|
|
4
|
-
"sourcesContent": ["import { Alg } from \"../../../../../alg\";\nimport type { KPattern } from \"../../../../../kpuzzle/KPattern\";\nimport { puzzles } from \"../../../../../puzzles\";\nimport { randomChoice } from \"random-uint-below\";\nimport { mustBeInsideWorker } from \"../../../inside-worker\";\nimport { addOrientationSuffix } from \"../../addOrientationSuffix\";\nimport { dynamic3x3x3min2phase } from \"../dynamic/3x3x3\";\nimport { toMin2PhasePattern } from \"./convert\";\nimport { passesFilter } from \"./filter\";\nimport { sgs3x3x3 } from \"./legacy-sgs\";\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 { AlgBuilder, Move, type Alg } from \"../../../alg\";\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 { from } from \"../../../../../../vendor/mit/p-lazy/p-lazy\";\n\nexport const dynamic3x3x3min2phase = from<\n typeof import(\"./search-dynamic-solve-3x3x3\")\n>(() => import(\"./search-dynamic-solve-3x3x3\"));\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\";\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\";\nimport type { KPuzzle } from \"../../../../../kpuzzle\";\nimport { KPattern } from \"../../../../../kpuzzle\";\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"],
|
|
5
|
-
"mappings": "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ACA;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;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,CAAC,IAAI,mCAAmC,iCAAiC;AAC3E;;;ANvRA,eAAsB,mBAAsC;AAC1D,QAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,QAAQ;AAC/C,MAAI,UAAU,QAAQ,eAAe;AACrC,aAAW,SAAS,UAAU;AAC5B,cAAU,QAAQ,SAAS,IAAI,WAAWC,cAAa,KAAK,CAAC,CAAC;AAAA,EAChE;AACA,MAAI,CAAC,aAAa,SAAS,OAAO,GAAG;AACnC,WAAO,iBAAiB;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,eAAsB,SAAS,GAA2B;AACxD,qBAAmB;AACnB,SAAO,IAAI;AAAA,KACR,MAAM,uBAAuB,aAAa,mBAAmB,CAAC,CAAC;AAAA,EAClE;AACF;AAEA,eAAsB,oBAAkC;AACtD,SAAO,SAAS,MAAM,iBAAiB,CAAC;AAC1C;AAEA,eAAsB,gBAA+B;AACnD,GAAC,MAAM,uBAAuB,WAAW;AAC3C;AAEA,IAAM,iBAAiB;AAAA,EACrB,CAAC,MAAM,MAAM,OAAO,OAAO,MAAM,KAAK;AAAA,EACtC,CAAC,MAAM,MAAM,OAAO,KAAK;AAC3B;AAEA,eAAsB,4BAA0C;AAC9D,SAAO,qBAAqB,MAAM,kBAAkB,GAAG,cAAc;AACvE;",
|
|
6
|
-
"names": ["randomChoice", "randomChoice"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/search/inside/solve/puzzles/clock.ts", "../../../../src/cubing/vendor/apache/comlink-everywhere/outside/index.ts", "../../../../src/cubing/search/worker-workarounds/index.ts", "../../../../src/cubing/search/instantiator.ts", "../../../../src/cubing/search/outside.ts"],
|
|
4
|
-
"sourcesContent": ["import { randomUIntBelow } from \"random-uint-below\";\n\nconst backMoves = [\"U\", \"R\", \"D\", \"L\", \"ALL\"];\nconst frontMoves = [\"UR\", \"DR\", \"DL\", \"UL\"].concat(backMoves);\n\nexport function randomClockScrambleString(): string {\n let filteringMoveCount = 0;\n\n function randomSuffix() {\n const amount = randomUIntBelow(12);\n if (amount !== 0) {\n filteringMoveCount++;\n }\n if (amount <= 6) {\n return `${amount}+`;\n } else {\n return `${12 - amount}-`;\n }\n }\n\n const moves = [];\n function side(families: string[]): void {\n for (const family of families) {\n moves.push(`${family}${randomSuffix()}`);\n }\n }\n\n side(frontMoves);\n moves.push(\"y2\");\n side(backMoves);\n\n // https://www.worldcubeassociation.org/regulations/#4b3\n if (filteringMoveCount < 2) {\n return randomClockScrambleString();\n }\n\n return moves.join(\" \");\n}\n", "import nodeEndpoint from \"../node-adapter\";\n\nexport { wrap } from \"comlink\";\nconst useNodeWorkarounds =\n typeof globalThis.Worker === \"undefined\" &&\n typeof (globalThis as any).WorkerNavigator === \"undefined\";\n\nasync function nodeWorker(\n source: string | URL,\n options?: { eval?: boolean },\n): Promise<Worker> {\n const { Worker: NodeWorker } = globalThis.process.getBuiltinModule(\n \"node:worker_threads\",\n );\n const worker = new NodeWorker(source, options);\n worker.unref();\n return nodeEndpoint(worker);\n}\n\nexport async function constructWorker(\n source: string | URL,\n options?: { type?: WorkerType },\n): Promise<Worker> {\n let worker: Worker;\n if (useNodeWorkarounds) {\n return nodeWorker(source);\n } else {\n worker = new globalThis.Worker(source, {\n type: options ? options.type : undefined, // TODO: Is it safe to use `options?.type`?\n });\n }\n return worker;\n}\n", "import { exposeAPI } from \"./worker-guard\";\n\nexport async function searchWorkerURLImportMetaResolve(): Promise<string> {\n // Note:\n // - We have to hardcode the expected path of the entry file in the ESM build, due to lack of `esbuild` support: https://github.com/evanw/esbuild/issues/2866\n // - This URL is based on the assumption that the code from this file ends up in a shared chunk in the `esm` build. This is not guaranteed by `esbuild`, but it consistently happens for our codebase.\n // - We inline the value (instead of using a constant), to maximize compatibility for hardcoded syntax detection in bundlers.\n // - `import.meta.resolve(\u2026)` returns a sync result in every environment except `bun`: https://loadeverything.net/#compatibility-dashboard\n // - We assume that it's `async`, just in case.\n // @ts-ignore\n return import.meta.resolve(\"./search-worker-entry.js\");\n}\n\nexport function searchWorkerURLNewURLImportMetaURL(): URL {\n // Note:\n // - We have to hardcode the expected path of the entry file in the ESM build, due to lack of `esbuild` support: https://github.com/evanw/esbuild/issues/795\n // - This URL is based on the assumption that the code from this file ends up in a shared chunk in the `esm` build. This is not guaranteed by `esbuild`, but it consistently happens for our codebase.\n // - We inline the value (instead of using a constant), to maximize compatibility for hardcoded syntax detection in bundlers.\n return new URL(\"./search-worker-entry.js\", import.meta.url);\n}\n\n// Workaround for `esbuild`: https://github.com/evanw/esbuild/issues/312#issuecomment-1092195778\nexport async function searchWorkerURLEsbuildWorkaround(): Promise<string> {\n exposeAPI.expose = false;\n return (await import(\"./search-worker-entry.js\")).WORKER_ENTRY_FILE_URL;\n}\n\nexport function instantiateSearchWorkerURLNewURLImportMetaURL(): Worker {\n return new Worker(new URL(\"./search-worker-entry.js\", import.meta.url), {\n type: \"module\",\n });\n}\n", "import {\n constructWorker,\n wrap,\n} from \"../vendor/apache/comlink-everywhere/outside\";\nimport type { WorkerInsideAPI } from \"./inside/api\";\nimport { searchOutsideDebugGlobals } from \"./outside\";\nimport {\n instantiateSearchWorkerURLNewURLImportMetaURL,\n searchWorkerURLEsbuildWorkaround,\n searchWorkerURLImportMetaResolve,\n searchWorkerURLNewURLImportMetaURL,\n} from \"./worker-workarounds\";\n\nexport interface WorkerOutsideAPI {\n terminate: () => void; // `node` can return a `Promise` with an exit code, but we match the web worker API.\n}\nexport interface InsideOutsideAPI {\n insideAPI: WorkerInsideAPI;\n outsideAPI: WorkerOutsideAPI;\n}\n\nfunction probablyCrossOrigin(workerEntryFileURL: URL): boolean {\n try {\n const scriptOrigin = globalThis.location?.origin;\n const workerOrigin = workerEntryFileURL.origin;\n return !!scriptOrigin && !!workerOrigin && scriptOrigin !== workerOrigin;\n } catch {\n return false;\n }\n}\n\nasync function instantiateModuleWorker(\n workerEntryFileURL: string | URL,\n): Promise<InsideOutsideAPI> {\n // We need the `import.meta.url` base for `bun`.\n const url = new URL(workerEntryFileURL, import.meta.url);\n const tryTrampolineFirst = probablyCrossOrigin(url);\n try {\n return instantiateModuleWorkerAttempt(url, tryTrampolineFirst);\n } catch {\n return instantiateModuleWorkerAttempt(url, !tryTrampolineFirst);\n }\n}\n\ninterface BunWorker extends Worker {\n unref?: () => void;\n}\n\nasync function instantiateModuleWorkerAttempt(\n workerEntryFileURL: URL,\n crossOriginTrampoline: boolean,\n): Promise<InsideOutsideAPI> {\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO\n return new Promise<InsideOutsideAPI>(async (resolve, reject) => {\n try {\n if (!workerEntryFileURL) {\n reject(new Error(\"Could not get worker entry file URL.\"));\n }\n let url: URL = workerEntryFileURL;\n if (crossOriginTrampoline) {\n // Standard browser-like environment.\n const importSrc = `import ${JSON.stringify(\n workerEntryFileURL.toString(),\n )};`;\n const blob = new Blob([importSrc], {\n type: \"text/javascript\",\n });\n url = new URL(URL.createObjectURL(blob));\n }\n\n const worker = (await constructWorker(url, {\n type: \"module\",\n })) as Worker & {\n nodeWorker?: import(\"worker_threads\").Worker;\n } & BunWorker;\n\n worker.unref?.(); // Unref in `bun`.\n\n const onError = (e: ErrorEvent) => {\n reject(e);\n };\n\n // TODO: Remove this once we can remove the workarounds for lack of `import.meta.resolve(\u2026)` support.\n const onFirstMessage = (messageData: string) => {\n if (messageData === \"comlink-exposed\") {\n // We need to clear the timeout so that we don't prevent `node` from exiting in the meantime.\n resolve(wrapWithTerminate(worker));\n } else {\n reject(\n new Error(`wrong module instantiation message ${messageData}`),\n );\n }\n };\n\n if (worker.nodeWorker) {\n // We have to use `once` so the `unref()` from `comlink-everywhere` allows the process to quit as expected.\n worker.nodeWorker.once(\"message\", onFirstMessage);\n } else {\n worker.addEventListener(\"error\", onError, {\n once: true,\n });\n worker.addEventListener(\"message\", (e) => onFirstMessage(e.data), {\n once: true,\n });\n }\n } catch (e) {\n reject(e);\n }\n });\n}\n\n// Maybe some day if we work really hard, this code path can work:\n// - in `node` (https://github.com/nodejs/node/issues/43583#issuecomment-1540025755)\n// - for CDNs (https://github.com/tc39/proposal-module-expressions or https://github.com/whatwg/html/issues/6911)\nexport async function instantiateModuleWorkerDirectlyForBrowser(): Promise<InsideOutsideAPI> {\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO\n return new Promise<InsideOutsideAPI>(async (resolve, reject) => {\n try {\n const worker = instantiateSearchWorkerURLNewURLImportMetaURL();\n\n const onError = (e: ErrorEvent) => {\n reject(e);\n };\n\n // TODO: Remove this once we can remove the workarounds for lack of `import.meta.resolve(\u2026)` support.\n const onFirstMessage = (messageData: string) => {\n if (messageData === \"comlink-exposed\") {\n // We need to clear the timeout so that we don't prevent `node` from exiting in the meantime.\n resolve(wrapWithTerminate(worker));\n } else {\n reject(\n new Error(`wrong module instantiation message ${messageData}`),\n );\n }\n };\n\n worker.addEventListener(\"error\", onError, {\n once: true,\n });\n worker.addEventListener(\"message\", (e) => onFirstMessage(e.data), {\n once: true,\n });\n } catch (e) {\n reject(e);\n }\n });\n}\n\nfunction wrapWithTerminate(worker: Worker): InsideOutsideAPI {\n const insideAPI = wrap<WorkerInsideAPI>(worker);\n const terminate = worker.terminate.bind(worker);\n return { insideAPI, outsideAPI: { terminate } };\n}\n\nexport const allInsideOutsideAPIPromises: Promise<InsideOutsideAPI>[] = [];\n\nexport async function instantiateWorker(): Promise<InsideOutsideAPI> {\n const insideOutsideAPIPromise = instantiateWorkerImplementation();\n allInsideOutsideAPIPromises.push(insideOutsideAPIPromise);\n const { insideAPI } = await insideOutsideAPIPromise;\n insideAPI.setDebugMeasurePerf(searchOutsideDebugGlobals.logPerf);\n insideAPI.setScramblePrefetchLevel(\n searchOutsideDebugGlobals.scramblePrefetchLevel,\n );\n return insideOutsideAPIPromise;\n}\n\nexport async function mapToAllWorkers(\n f: (worker: InsideOutsideAPI) => void,\n): Promise<void> {\n await Promise.all(\n allInsideOutsideAPIPromises.map((worker) => worker.then(f)),\n );\n}\n\nasync function instantiateWorkerImplementation(): Promise<InsideOutsideAPI> {\n if (globalThis.location?.protocol === \"file:\") {\n console.warn(\n \"This current web page is loaded from the local filesystem (a URL that starts with `file://`). In this situation, `cubing.js` may be unable to generate scrambles or perform searches in some browsers. See: https://js.cubing.net/cubing/scramble/#file-server-required\",\n );\n }\n\n function failed(methodDescription?: string) {\n return `Module worker instantiation${\n methodDescription ? ` ${methodDescription}` : \"\"\n } failed`;\n }\n\n const fallbackOrder: [\n fn: () => Promise<InsideOutsideAPI>,\n description: string,\n warnOnSuccess: null | string,\n ][] = [\n [\n async () =>\n instantiateModuleWorker(await searchWorkerURLImportMetaResolve()),\n \"using `import.meta.resolve(\u2026)\",\n null,\n ],\n // TODO: This fallback should be lower (because it's less portable), but we need to try it earlier to work around https://github.com/parcel-bundler/parcel/issues/9051\n [\n instantiateModuleWorkerDirectlyForBrowser,\n \"using inline `new URL(\u2026, import.meta.url)`\",\n \"may\",\n ],\n [\n async () => instantiateModuleWorker(searchWorkerURLNewURLImportMetaURL()),\n \"using `new URL(\u2026, import.meta.url)`\",\n \"will\",\n ],\n [\n async () =>\n instantiateModuleWorker(await searchWorkerURLEsbuildWorkaround()),\n \"using the `esbuild` workaround\",\n \"will\",\n ],\n ];\n\n for (const [fn, description, warnOnSuccess] of fallbackOrder) {\n try {\n const worker = await fn();\n if (warnOnSuccess) {\n if (searchOutsideDebugGlobals.showWorkerInstantiationWarnings) {\n console.warn(\n `Module worker instantiation required ${description}. \\`cubing.js\\` ${warnOnSuccess} not support this fallback in the future.`,\n );\n }\n }\n return worker;\n } catch {\n if (searchOutsideDebugGlobals.showWorkerInstantiationWarnings) {\n console.warn(`${failed(description)}, falling back.`);\n }\n }\n }\n\n throw new Error(`${failed()}. There are no more fallbacks available.`);\n}\n", "import { Alg } from \"../alg\";\nimport type { KPuzzle } from \"../kpuzzle\";\n// import { preInitialize222 } from \"../implementations/2x2x2\";\nimport type { KPattern } from \"../kpuzzle/KPattern\";\nimport type { PrefetchLevel } from \"./inside/api\";\nimport { randomClockScrambleString } from \"./inside/solve/puzzles/clock\"; // TODO: don't reach into `inside` code.\nimport type { TwsearchOptions } from \"./inside/solve/twsearch\";\nimport {\n type InsideOutsideAPI,\n instantiateWorker,\n mapToAllWorkers,\n} from \"./instantiator\";\n\nlet cachedWorkerInstance: Promise<InsideOutsideAPI> | undefined;\nfunction getCachedWorkerInstance(): Promise<InsideOutsideAPI> {\n return (cachedWorkerInstance ??= instantiateWorker());\n}\n\n// Pre-initialize the scrambler for the given event. (Otherwise, an event is\n// initialized the first time you ask for a scramble for that event.)\n//\n// Some typical numbers for a fast computer:\n// - 3x3x3 initialization: 200ms\n// - Each 3x3x3 scramble: 50ms\n// - 4x4x4 initialization: 2500ms\n// - Each 4x4x4 scramble: 300ms to 800ms\n//\n// It is safe to immediately call for a scramble\n// any time after starting pre-initialization, or to call for them without\n// pre-initializing. Pre-initializing essentially gives the scramble worker a\n// head start in case a scramble doesn't get requested immediately.\n//\n// Note that events cannot be pre-initialized in parallel. Attempting to\n// pre-initialize multiple events will initialize them consecutively. Scrambles\n// for a given event cannot be computed while another event is being initialized.\nexport function _preInitializationHintForEvent(\n eventID: string,\n // callback?: () => void\n): void {\n switch (eventID) {\n case \"333oh\":\n _preInitializationHintForEvent(\"333\");\n return;\n }\n (async () => {\n await (await getCachedWorkerInstance()).insideAPI.initialize(eventID);\n })();\n}\n\nexport async function randomScrambleForEvent(eventID: string): Promise<Alg> {\n switch (eventID) {\n case \"clock\":\n return Alg.fromString(await randomClockScrambleString());\n }\n const prom = _randomScrambleStringForEvent(eventID);\n const wat = await prom;\n return Alg.fromString(wat);\n}\n\nexport async function _randomScrambleStringForEvent(\n eventID: string,\n): Promise<string> {\n if (searchOutsideDebugGlobals.forceNewWorkerForEveryScramble) {\n }\n const worker = searchOutsideDebugGlobals.forceNewWorkerForEveryScramble\n ? await instantiateWorker()\n : await getCachedWorkerInstance();\n return worker.insideAPI.randomScrambleStringForEvent(eventID);\n}\n\nexport async function randomScrambleStringForEvent(\n eventID: string,\n): Promise<string> {\n switch (eventID) {\n case \"clock\":\n return randomClockScrambleString();\n }\n return await _randomScrambleStringForEvent(eventID);\n}\n\nexport async function experimentalSolve3x3x3IgnoringCenters(\n pattern: KPattern,\n): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(\n await cwi.insideAPI.solve333ToString(pattern.patternData),\n );\n}\n\nexport async function experimentalSolve2x2x2(pattern: KPattern): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(\n await cwi.insideAPI.solve222ToString(pattern.patternData),\n );\n}\n\nexport async function solveSkewb(pattern: KPattern): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(\n await cwi.insideAPI.solveSkewbToString(pattern.patternData),\n );\n}\n\nexport async function solvePyraminx(pattern: KPattern): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(\n await cwi.insideAPI.solvePyraminxToString(pattern.patternData),\n );\n}\n\nexport async function solveMegaminx(pattern: KPattern): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(\n await cwi.insideAPI.solveMegaminxToString(pattern.patternData),\n );\n}\n\nexport interface SolveTwsearchOptions {\n generatorMoves?: string[];\n targetPattern?: KPattern;\n minDepth?: number;\n maxDepth?: number;\n}\n\nexport async function solveTwsearch(\n kpuzzle: KPuzzle,\n pattern: KPattern,\n options?: SolveTwsearchOptions,\n): Promise<Alg> {\n const { targetPattern, ...otherOptions } = options ?? {};\n const apiOptions: TwsearchOptions = otherOptions;\n if (targetPattern) {\n apiOptions.targetPattern = targetPattern.patternData;\n }\n const { ...def } = kpuzzle.definition;\n delete def.experimentalIsPatternSolved;\n // delete def.derivedMoves;\n const dedicatedWorker = await instantiateWorker();\n try {\n return Alg.fromString(\n await dedicatedWorker.insideAPI.solveTwsearchToString(\n def,\n pattern.patternData,\n apiOptions,\n ),\n );\n } finally {\n console.log(\"Search ended, terminating dedicated `twsearch` worker.\");\n // TODO: support re-using the same worker for multiple searches..\n await dedicatedWorker.outsideAPI.terminate();\n }\n}\n\ninterface SearchOutsideDebugGlobals {\n logPerf: boolean;\n scramblePrefetchLevel: `${PrefetchLevel}`;\n disableStringWorker: boolean;\n forceNewWorkerForEveryScramble: boolean;\n showWorkerInstantiationWarnings: boolean;\n}\nexport const searchOutsideDebugGlobals: SearchOutsideDebugGlobals = {\n logPerf: true,\n scramblePrefetchLevel: \"auto\",\n disableStringWorker: false,\n forceNewWorkerForEveryScramble: false,\n showWorkerInstantiationWarnings: true,\n};\n\nexport function setSearchDebug(\n options: Partial<SearchOutsideDebugGlobals>,\n): void {\n const { logPerf, scramblePrefetchLevel } = options;\n if (typeof logPerf !== \"undefined\") {\n searchOutsideDebugGlobals.logPerf = logPerf;\n mapToAllWorkers((worker) => worker.insideAPI.setDebugMeasurePerf(logPerf));\n }\n if (typeof scramblePrefetchLevel !== \"undefined\") {\n searchOutsideDebugGlobals.scramblePrefetchLevel = scramblePrefetchLevel;\n mapToAllWorkers((worker) =>\n worker.insideAPI.setScramblePrefetchLevel(\n scramblePrefetchLevel as PrefetchLevel,\n ),\n );\n }\n if (\"disableStringWorker\" in options) {\n searchOutsideDebugGlobals.disableStringWorker =\n !!options.disableStringWorker;\n }\n if (\"forceNewWorkerForEveryScramble\" in options) {\n searchOutsideDebugGlobals.forceNewWorkerForEveryScramble =\n !!options.forceNewWorkerForEveryScramble;\n }\n if (\"showWorkerInstantiationWarnings\" in options) {\n searchOutsideDebugGlobals.showWorkerInstantiationWarnings =\n !!options.showWorkerInstantiationWarnings;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|