cubing 0.61.3 → 0.62.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/bin/chunks/{chunk-5WXNSJ2M.js → chunk-7HTSOKX4.js} +2 -2
- package/dist/bin/order.js +3 -3
- package/dist/bin/order.js.map +2 -2
- package/dist/bin/puzzle-geometry-bin.js +3 -3
- package/dist/bin/puzzle-geometry-bin.js.map +2 -2
- package/dist/bin/scramble.js +3 -3
- package/dist/bin/scramble.js.map +2 -2
- package/dist/lib/cubing/{PuzzleLoader-CkghxdIL.d.ts → PuzzleLoader-B2JfN7uX.d.ts} +7 -7
- package/dist/lib/cubing/alg/index.d.ts +2 -2
- package/dist/lib/cubing/alg/index.js +1 -1
- package/dist/lib/cubing/bluetooth/index.d.ts +23 -4
- package/dist/lib/cubing/bluetooth/index.js +13 -10
- package/dist/lib/cubing/bluetooth/index.js.map +2 -2
- package/dist/lib/cubing/chunks/{big-puzzle-orientation-3GQ3L26S.js → big-puzzle-orientation-ZVZQJEF5.js} +2 -2
- package/dist/lib/cubing/chunks/{chunk-T3SF7NHB.js → chunk-2AUSVPAU.js} +3 -3
- package/dist/lib/cubing/chunks/{chunk-T3SF7NHB.js.map → chunk-2AUSVPAU.js.map} +2 -2
- package/dist/lib/cubing/chunks/{chunk-ZGT5MZSV.js → chunk-5F7JRCTP.js} +5 -5
- package/dist/lib/cubing/chunks/{chunk-MZKROP74.js → chunk-FLK6AZKB.js} +4 -4
- package/dist/lib/cubing/chunks/{chunk-MZKROP74.js.map → chunk-FLK6AZKB.js.map} +1 -1
- package/dist/lib/cubing/chunks/{chunk-QSGI7DXX.js → chunk-FUHYAW74.js} +4 -4
- package/dist/lib/cubing/chunks/{chunk-QSGI7DXX.js.map → chunk-FUHYAW74.js.map} +1 -1
- package/dist/lib/cubing/chunks/{chunk-XITTJ75E.js → chunk-LIVDX4MD.js} +79 -35
- package/dist/lib/cubing/chunks/chunk-LIVDX4MD.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-3PS5LIPR.js → chunk-LWCBAAHO.js} +15 -9
- package/dist/lib/cubing/chunks/{chunk-3PS5LIPR.js.map → chunk-LWCBAAHO.js.map} +2 -2
- package/dist/lib/cubing/chunks/{chunk-WI337PMF.js → chunk-NGW52SHR.js} +3 -3
- package/dist/lib/cubing/chunks/{chunk-7D7ZUWUK.js → chunk-O6HEZXGY.js} +1 -1
- package/dist/lib/cubing/chunks/chunk-O6HEZXGY.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-WAYEJXCG.js → chunk-RINY3U6G.js} +2 -2
- package/dist/lib/cubing/chunks/{chunk-AVOUJS6N.js → chunk-ROB5TROI.js} +2 -2
- package/dist/lib/cubing/chunks/{chunk-ZKJKRQKY.js → chunk-XO3JAA3V.js} +1 -2
- package/dist/lib/cubing/chunks/chunk-XO3JAA3V.js.map +7 -0
- package/dist/lib/cubing/chunks/{chunk-LCJT5ROJ.js → chunk-ZU7PSGX4.js} +3 -3
- package/dist/lib/cubing/chunks/chunk-ZU7PSGX4.js.map +7 -0
- package/dist/lib/cubing/chunks/{inside-FGQBCNHY.js → inside-TJAQBDDY.js} +16 -16
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-E5KVBK2Y.js → search-dynamic-sgs-side-events-GB4WAJ7I.js} +6 -6
- package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-IFHNOIEL.js → search-dynamic-sgs-unofficial-2CECFBP3.js} +6 -6
- package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-OBPW4YC2.js → search-dynamic-solve-4x4x4-NRWKTCNT.js} +8 -8
- package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-HZREG6ZH.js → search-dynamic-solve-fto-UZMNOI6U.js} +2 -2
- package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-GCNVEBDJ.js → search-dynamic-solve-kilominx-CD57C3C4.js} +2 -2
- package/dist/lib/cubing/chunks/search-worker-entry.js +5 -7
- package/dist/lib/cubing/chunks/search-worker-entry.js.map +2 -2
- package/dist/lib/cubing/chunks/{twips-OVT324QJ.js → twips-YHXBF55O.js} +2 -2
- package/dist/lib/cubing/chunks/{twisty-dynamic-3d-O6UL3R7C.js → twisty-dynamic-3d-IKE4BUQG.js} +9 -9
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-IKE4BUQG.js.map +7 -0
- package/dist/lib/cubing/events-BDkOaqlG.d.ts +35 -0
- package/dist/lib/cubing/{index-B_8W-2zR.d.ts → index-DWA95mSl.d.ts} +1 -1
- package/dist/lib/cubing/kpuzzle/index.d.ts +1 -1
- package/dist/lib/cubing/kpuzzle/index.js +2 -2
- package/dist/lib/cubing/notation/index.d.ts +1 -1
- package/dist/lib/cubing/notation/index.js +4 -4
- package/dist/lib/cubing/protocol/index.d.ts +1 -1
- package/dist/lib/cubing/protocol/index.js +4 -4
- package/dist/lib/cubing/puzzle-geometry/index.d.ts +2 -2
- package/dist/lib/cubing/puzzle-geometry/index.js +1 -1
- package/dist/lib/cubing/puzzle-geometry/index.js.map +1 -1
- package/dist/lib/cubing/puzzles/index.d.ts +1 -1
- package/dist/lib/cubing/puzzles/index.js +4 -4
- package/dist/lib/cubing/scramble/index.d.ts +2 -2
- package/dist/lib/cubing/scramble/index.js +7 -7
- package/dist/lib/cubing/search/index.d.ts +3 -3
- package/dist/lib/cubing/search/index.js +7 -7
- package/dist/lib/cubing/stream/index.d.ts +4 -16
- package/dist/lib/cubing/stream/index.js +1 -1
- package/dist/lib/cubing/stream/index.js.map +2 -2
- package/dist/lib/cubing/twisty/index.d.ts +2 -2
- package/dist/lib/cubing/twisty/index.js +70 -62
- package/dist/lib/cubing/twisty/index.js.map +2 -2
- package/package.json +3 -3
- package/dist/lib/cubing/bluetooth-puzzle-c-_IBAdu.d.ts +0 -43
- package/dist/lib/cubing/chunks/chunk-7D7ZUWUK.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-LCJT5ROJ.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-XITTJ75E.js.map +0 -7
- package/dist/lib/cubing/chunks/chunk-ZKJKRQKY.js.map +0 -7
- package/dist/lib/cubing/chunks/twisty-dynamic-3d-O6UL3R7C.js.map +0 -7
- /package/dist/bin/chunks/{chunk-5WXNSJ2M.js.map → chunk-7HTSOKX4.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{big-puzzle-orientation-3GQ3L26S.js.map → big-puzzle-orientation-ZVZQJEF5.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-ZGT5MZSV.js.map → chunk-5F7JRCTP.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-WI337PMF.js.map → chunk-NGW52SHR.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-WAYEJXCG.js.map → chunk-RINY3U6G.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{chunk-AVOUJS6N.js.map → chunk-ROB5TROI.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{inside-FGQBCNHY.js.map → inside-TJAQBDDY.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-E5KVBK2Y.js.map → search-dynamic-sgs-side-events-GB4WAJ7I.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-IFHNOIEL.js.map → search-dynamic-sgs-unofficial-2CECFBP3.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-OBPW4YC2.js.map → search-dynamic-solve-4x4x4-NRWKTCNT.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-HZREG6ZH.js.map → search-dynamic-solve-fto-UZMNOI6U.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-GCNVEBDJ.js.map → search-dynamic-solve-kilominx-CD57C3C4.js.map} +0 -0
- /package/dist/lib/cubing/chunks/{twips-OVT324QJ.js.map → twips-YHXBF55O.js.map} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cubing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.62.1",
|
|
4
4
|
"description": "A collection of JavaScript cubing libraries.",
|
|
5
5
|
"author": "The js.cubing.net team",
|
|
6
6
|
"license": "MPL-2.0 OR GPL-3.0-or-later",
|
|
@@ -74,12 +74,12 @@
|
|
|
74
74
|
"type-fest": "^5.2.0"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
|
-
"@biomejs/biome": "2.3.
|
|
77
|
+
"@biomejs/biome": "^2.3.11",
|
|
78
78
|
"@cubing/deploy": ">=0.4.10",
|
|
79
79
|
"@cubing/dev-config": ">=0.8.3",
|
|
80
80
|
"@esm-bundle/chai": "^4.3.4-fix.0",
|
|
81
81
|
"@schemastore/package": "^0.0.10",
|
|
82
|
-
"@types/bun": "^1.
|
|
82
|
+
"@types/bun": "^1.3.5",
|
|
83
83
|
"@types/chai": "^5.0.0",
|
|
84
84
|
"@types/dom-speech-recognition": "^0.0.4",
|
|
85
85
|
"@types/mocha": "^10.0.8",
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { A as AlgLeaf, K as KPattern } from './PuzzleLoader-CkghxdIL.js';
|
|
2
|
-
|
|
3
|
-
interface StreamTransformer {
|
|
4
|
-
transformAlgLeaf(algLeafEvent: AlgLeafEvent): void;
|
|
5
|
-
transformOrientation(orientationEvent: OrientationEvent): void;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
/******** BluetoothPuzzle ********/
|
|
9
|
-
/** @category Smart Puzzles */
|
|
10
|
-
interface AlgLeafEvent {
|
|
11
|
-
latestAlgLeaf: AlgLeaf;
|
|
12
|
-
timeStamp: number;
|
|
13
|
-
debug?: Record<string, unknown>;
|
|
14
|
-
pattern?: KPattern;
|
|
15
|
-
quaternion?: any;
|
|
16
|
-
}
|
|
17
|
-
/** @category Smart Puzzles */
|
|
18
|
-
interface OrientationEvent {
|
|
19
|
-
quaternion: {
|
|
20
|
-
x: number;
|
|
21
|
-
y: number;
|
|
22
|
-
z: number;
|
|
23
|
-
w: number;
|
|
24
|
-
};
|
|
25
|
-
timeStamp: number;
|
|
26
|
-
debug?: Record<string, unknown>;
|
|
27
|
-
}
|
|
28
|
-
/** @category Smart Puzzles */
|
|
29
|
-
declare abstract class BluetoothPuzzle extends EventTarget {
|
|
30
|
-
transformers: StreamTransformer[];
|
|
31
|
-
protected listeners: Array<(e: AlgLeafEvent) => void>;
|
|
32
|
-
protected orientationListeners: Array<(e: OrientationEvent) => void>;
|
|
33
|
-
abstract name(): string | undefined;
|
|
34
|
-
abstract disconnect(): void;
|
|
35
|
-
getPattern(): Promise<KPattern>;
|
|
36
|
-
addAlgLeafListener(listener: (e: AlgLeafEvent) => void): void;
|
|
37
|
-
addOrientationListener(listener: (e: OrientationEvent) => void): void;
|
|
38
|
-
experimentalAddBasicRotationTransformer(): void;
|
|
39
|
-
protected dispatchAlgLeaf(algLeaf: AlgLeafEvent): void;
|
|
40
|
-
protected dispatchOrientation(orientationEvent: OrientationEvent): void;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export { type AlgLeafEvent as A, BluetoothPuzzle as B, type OrientationEvent as O };
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/alg/common.ts", "../../../../src/cubing/alg/iteration.ts", "../../../../src/cubing/alg/alg-nodes/containers/Commutator.ts", "../../../../src/cubing/alg/alg-nodes/containers/Conjugate.ts", "../../../../src/cubing/alg/limits.ts", "../../../../src/cubing/alg/AlgBuilder.ts", "../../../../src/cubing/alg/alg-nodes/leaves/LineComment.ts", "../../../../src/cubing/alg/alg-nodes/leaves/Newline.ts", "../../../../src/cubing/alg/alg-nodes/leaves/Pause.ts", "../../../../src/cubing/alg/debug.ts", "../../../../src/cubing/alg/parseAlg.ts", "../../../../src/cubing/alg/warnOnce.ts", "../../../../src/cubing/alg/alg-nodes/QuantumWithAmount.ts", "../../../../src/cubing/alg/alg-nodes/leaves/Move.ts", "../../../../src/cubing/alg/alg-nodes/containers/Grouping.ts", "../../../../src/cubing/alg/is.ts", "../../../../src/cubing/alg/simplify/options.ts", "../../../../src/cubing/alg/simplify/append.ts", "../../../../src/cubing/alg/traversal.ts", "../../../../src/cubing/alg/simplify/simplify.ts", "../../../../src/cubing/alg/Alg.ts", "../../../../src/cubing/alg/example.ts", "../../../../src/cubing/alg/keyboard.ts", "../../../../src/cubing/alg/url.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Alg } from \"./Alg\";\nimport type { AlgLeaf, AlgNode } from \"./alg-nodes/AlgNode\";\nimport type { IterationDirection } from \"./iteration\";\nimport type { ExperimentalSerializationOptions } from \"./SerializationOptions\";\n\nlet writeAlgDebugField = false;\nexport function setAlgDebugField(debug: boolean): void {\n writeAlgDebugField = debug;\n}\n\nexport abstract class Comparable {\n is(c: any): boolean {\n return this instanceof c;\n }\n\n as<T>(c: new (...args: any) => T): T | null {\n return this instanceof c ? this : null;\n }\n\n abstract isIdentical(other: Comparable): boolean;\n}\n\nexport interface Repeatable extends Comparable {\n experimentalExpand(\n iterDir?: IterationDirection,\n depth?: number,\n ): Generator<AlgLeaf>;\n}\n\n// Common to `Alg` or `AlgNode` classes.\nexport abstract class AlgCommon<T extends Alg | AlgNode>\n extends Comparable\n implements Repeatable\n{\n constructor() {\n super();\n if (writeAlgDebugField) {\n Object.defineProperty(this, \"_debugStr\", {\n get: () => {\n return this.toString();\n },\n });\n }\n }\n\n get log(): (message?: any) => void {\n // By returning a (bound) version of `console.log`, we ensure that DevTools\n // logs the call site instead of this function.\n return console.log.bind(console, this, this.toString()) as (\n message?: any,\n ) => void;\n }\n\n abstract override toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string;\n\n abstract invert(): T;\n\n abstract experimentalExpand(iterDir: IterationDirection): Generator<AlgLeaf>;\n}\n", "export enum IterationDirection {\n Forwards = 1,\n Backwards = -1,\n}\n\nexport function toggleDirection(\n iterationDirection: IterationDirection,\n flip: boolean = true,\n): IterationDirection {\n if (!flip) {\n return iterationDirection;\n }\n switch (iterationDirection) {\n case IterationDirection.Forwards:\n return IterationDirection.Backwards;\n case IterationDirection.Backwards:\n return IterationDirection.Forwards;\n }\n}\n\nexport function direct<T>(\n g: Iterable<T>,\n iterDir: IterationDirection,\n): Iterable<T> {\n return iterDir === IterationDirection.Backwards ? Array.from(g).reverse() : g;\n}\n\nexport function reverse<T>(g: Iterable<T>): Iterable<T> {\n return Array.from(g).reverse();\n}\n\nexport function* directedGenerator<T>(\n g: Generator<T>,\n direction: IterationDirection,\n): Generator<T> {\n direction === IterationDirection.Backwards\n ? yield* reverseGenerator(g)\n : yield* g;\n}\n\nexport function* reverseGenerator<T>(g: Generator<T>): Generator<T> {\n for (const t of Array.from(g).reverse()) {\n yield t;\n }\n}\n", "import type { ExperimentalSerializationOptions } from \"cubing/alg/SerializationOptions\";\nimport {\n type Alg,\n experimentalEnsureAlg,\n type FlexibleAlgSource,\n} from \"../../Alg\";\nimport { AlgCommon, type Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n/** @category Alg Nodes */\nexport class Commutator extends AlgCommon<Commutator> {\n readonly #A: Alg;\n readonly #B: Alg;\n\n constructor(aSource: FlexibleAlgSource, bSource: FlexibleAlgSource) {\n super();\n this.#A = experimentalEnsureAlg(aSource);\n this.#B = experimentalEnsureAlg(bSource);\n }\n\n get A(): Alg {\n return this.#A;\n }\n\n get B(): Alg {\n return this.#B;\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsCommutator = other.as(Commutator);\n return !!(\n otherAsCommutator?.A.isIdentical(this.A) &&\n otherAsCommutator?.B.isIdentical(this.B)\n );\n }\n\n invert(): Commutator {\n return new Commutator(this.#B, this.#A);\n }\n\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n if (depth === 0) {\n yield iterDir === IterationDirection.Forwards ? this : this.invert();\n } else {\n if (iterDir === IterationDirection.Forwards) {\n yield* this.A.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.B.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.A.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n yield* this.B.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n } else {\n yield* this.B.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.A.experimentalExpand(\n IterationDirection.Forwards,\n depth - 1,\n );\n yield* this.B.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n yield* this.A.experimentalExpand(\n IterationDirection.Backwards,\n depth - 1,\n );\n }\n }\n }\n\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return `[${this.#A.toString(experimentalSerializationOptions)}, ${this.#B.toString(experimentalSerializationOptions)}]`;\n }\n}\n", "import type { ExperimentalSerializationOptions } from \"cubing/alg/SerializationOptions\";\nimport {\n type Alg,\n experimentalEnsureAlg,\n type FlexibleAlgSource,\n} from \"../../Alg\";\nimport { AlgCommon, type Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n/** @category Alg Nodes */\nexport class Conjugate extends AlgCommon<Conjugate> {\n readonly #A: Alg;\n readonly #B: Alg;\n\n constructor(aSource: FlexibleAlgSource, bSource: FlexibleAlgSource) {\n super();\n this.#A = experimentalEnsureAlg(aSource);\n this.#B = experimentalEnsureAlg(bSource);\n }\n\n get A(): Alg {\n return this.#A;\n }\n\n get B(): Alg {\n return this.#B;\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsConjugate = other.as(Conjugate);\n return !!(\n otherAsConjugate?.A.isIdentical(this.A) &&\n otherAsConjugate?.B.isIdentical(this.B)\n );\n }\n\n invert(): Conjugate {\n return new Conjugate(this.#A, this.#B.invert());\n }\n\n *experimentalExpand(\n iterDir: IterationDirection,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n if (depth === 0) {\n yield iterDir === IterationDirection.Forwards ? this : this.invert();\n } else {\n yield* this.A.experimentalExpand(IterationDirection.Forwards, depth - 1);\n yield* this.B.experimentalExpand(iterDir, depth - 1);\n yield* this.A.experimentalExpand(IterationDirection.Backwards, depth - 1);\n }\n }\n\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return `[${this.A.toString(experimentalSerializationOptions)}: ${this.B.toString(experimentalSerializationOptions)}]`;\n }\n}\n", "export const MAX_INT = 0x7fffffff; // 2^31-1, the max value for signed 32-bit ints.\nexport const MAX_INT_DESCRIPTION = \"2^31 - 1\";\nexport const MIN_INT = -0x80000000;\nexport const MIN_INT_DESCRIPTION = \"-2^31\";\n", "import { Alg } from \"./Alg\";\nimport type { AlgNode } from \"./alg-nodes/AlgNode\";\n\n/** @category Alg */\nexport class AlgBuilder {\n #algNodes: AlgNode[] = [];\n\n push(u: AlgNode): void {\n this.#algNodes.push(u);\n }\n\n // TODO: Allow FlexibleAlgSource?\n /** @deprecated */\n experimentalPushAlg(alg: Alg): void {\n // TODO: Optimize?\n for (const u of alg.childAlgNodes()) {\n this.push(u);\n }\n }\n\n // TODO: can we guarantee this to be fast in the permanent API?\n experimentalNumAlgNodes(): number {\n return this.#algNodes.length;\n }\n\n // can be called multiple times, even if you push alg nodes inbetween.\n toAlg(): Alg {\n return new Alg(this.#algNodes);\n }\n\n reset(): void {\n this.#algNodes = [];\n }\n}\n", "import type { ExperimentalSerializationOptions } from \"cubing/alg/SerializationOptions\";\nimport { AlgCommon, type Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n// TODO: hash\n// TODO: this conflicts with the HTML `LineComment` class\n/** @category Alg Nodes */\nexport class LineComment extends AlgCommon<LineComment> {\n readonly #text: string;\n\n constructor(commentText: string) {\n super();\n if (commentText.includes(\"\\n\") || commentText.includes(\"\\r\")) {\n throw new Error(\"LineComment cannot contain newline\");\n }\n this.#text = commentText;\n }\n\n get text(): string {\n return this.#text;\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsLineComment = other as LineComment;\n return other.is(LineComment) && this.#text === otherAsLineComment.#text;\n }\n\n invert(): LineComment {\n return this;\n }\n\n *experimentalExpand(\n _iterDir: IterationDirection = IterationDirection.Forwards,\n _depth: number = Infinity,\n ): Generator<AlgLeaf> {\n yield this;\n }\n\n toString(\n _experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return `//${this.#text}`;\n }\n // toJSON(): LineCommentJSON {\n // return {\n // type: \"comment\",\n // text: this.#text,\n // };\n // }\n}\n", "import type { ExperimentalSerializationOptions } from \"cubing/alg/SerializationOptions\";\nimport { AlgCommon, type Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\n\n/** @category Alg Nodes */\nexport class Newline extends AlgCommon<Newline> {\n toString(\n _experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return \"\\n\";\n }\n\n isIdentical(other: Comparable): boolean {\n return other.is(Newline);\n }\n\n invert(): Newline {\n return this;\n }\n\n *experimentalExpand(\n _iterDir: IterationDirection = IterationDirection.Forwards,\n _depth: number = Infinity,\n ): Generator<AlgLeaf> {\n yield this;\n }\n}\n", "import type { ExperimentalSerializationOptions } from \"cubing/alg/SerializationOptions\";\nimport { AlgCommon, type Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport type { AlgLeaf } from \"../AlgNode\";\nimport type { Grouping } from \"../containers/Grouping\";\n\n/** @category Alg Nodes */\nexport class Pause extends AlgCommon<Pause> {\n experimentalNISSGrouping?: Grouping; // TODO: tie this to the alg\n\n toString(\n _experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return \".\";\n }\n\n isIdentical(other: Comparable): boolean {\n return other.is(Pause);\n }\n\n invert(): Pause {\n return this;\n }\n\n *experimentalExpand(\n _iterDir: IterationDirection = IterationDirection.Forwards,\n _depth: number = Infinity,\n ): Generator<AlgLeaf> {\n yield this;\n }\n}\n", "type ReportingLevel = \"none\" | \"warn\" | \"error\";\nlet currentReportingLevel = \"warn\";\n\nconst MAX_NUMBER_OF_TIMES_TO_WARN = 10;\nlet numWarned = 0;\n\n// TODO: Avoid creating the string message if it won't be used (e.g. by taking a function?).\nexport function reportTypeMismatch(msg: string): void {\n switch (currentReportingLevel) {\n case \"error\":\n throw new Error(msg);\n case \"warn\": {\n numWarned++;\n if (numWarned < MAX_NUMBER_OF_TIMES_TO_WARN) {\n if (numWarned + 1 === MAX_NUMBER_OF_TIMES_TO_WARN) {\n console.warn(msg);\n }\n }\n return;\n }\n }\n}\n\nexport function setAlgPartTypeMismatchReportingLevel(\n level: ReportingLevel,\n): void {\n currentReportingLevel = level;\n}\n\nexport const algDebugGlobals: { caretNISSNotationEnabled: boolean } = {\n caretNISSNotationEnabled: true,\n};\n\nexport function setAlgDebug(options: {\n caretNISSNotationEnabled?: boolean;\n}): void {\n if (\"caretNISSNotationEnabled\" in options) {\n algDebugGlobals.caretNISSNotationEnabled =\n !!options.caretNISSNotationEnabled;\n }\n}\n", "import { Alg } from \"./Alg\";\nimport { AlgBuilder } from \"./AlgBuilder\";\nimport type { AlgNode } from \"./alg-nodes\";\nimport { Commutator } from \"./alg-nodes/containers/Commutator\";\nimport { Conjugate } from \"./alg-nodes/containers/Conjugate\";\nimport { Grouping } from \"./alg-nodes/containers/Grouping\";\nimport { LineComment } from \"./alg-nodes/leaves/LineComment\";\nimport { Move, QuantumMove } from \"./alg-nodes/leaves/Move\";\nimport { Newline } from \"./alg-nodes/leaves/Newline\";\nimport { Pause } from \"./alg-nodes/leaves/Pause\";\nimport { algDebugGlobals } from \"./debug\";\n\ntype StoppingChar = \",\" | \":\" | \"]\" | \")\";\n\nfunction parseIntWithEmptyFallback<T>(n: string, emptyFallback: T): number | T {\n return n ? parseInt(n, 10) : emptyFallback;\n}\n\nconst AMOUNT_REGEX = /^(\\d+)?('?)/;\nconst MOVE_START_REGEX = /^[_\\dA-Za-z]/; // TODO: Handle slash\nconst QUANTUM_MOVE_REGEX = /^((([1-9]\\d*)-)?([1-9]\\d*))?([_A-Za-z]+)/;\nconst COMMENT_TEXT_REGEX = /^[^\\n]*/;\nconst SQUARE1_PAIR_START_REGEX = /^(-?\\d+), ?/; // TODO: match up with other whitespace handling?\nconst SQUARE1_PAIR_END_REGEX = /^(-?\\d+)\\)/; // TODO: match up with other whitespace handling?\n\nexport function parseAlg(s: string): Alg {\n return new AlgParser().parseAlg(s);\n}\n\nexport function parseMove(s: string): Move {\n return new AlgParser().parseMove(s);\n}\n\nexport function parseQuantumMove(s: string): QuantumMove {\n return new AlgParser().parseQuantumMove(s);\n}\n\nexport const startCharIndexKey = Symbol(\"startCharIndex\");\nexport const endCharIndexKey = Symbol(\"endCharIndex\");\n\nexport interface ParserIndexed {\n [startCharIndexKey]: number;\n [endCharIndexKey]: number;\n}\n\nexport type Parsed<T extends Alg | AlgNode> = T & ParserIndexed;\n\n// TODO: attach to parser so the end char index can default to `this.#idx`?\nfunction addCharIndices<T extends Alg | AlgNode>(\n t: T,\n startCharIndex: number,\n endCharIndex: number,\n): Parsed<T> {\n const parsedT = t as ParserIndexed & T;\n parsedT[startCharIndexKey] = startCharIndex;\n parsedT[endCharIndexKey] = endCharIndex;\n return parsedT;\n}\n\nexport function transferCharIndex<T extends Alg | AlgNode>(from: T, to: T): T {\n if (startCharIndexKey in from) {\n (to as Parsed<T>)[startCharIndexKey] = (from as Parsed<T>)[\n startCharIndexKey\n ];\n }\n if (endCharIndexKey in from) {\n (to as Parsed<T>)[endCharIndexKey] = (from as Parsed<T>)[endCharIndexKey];\n }\n return to;\n}\n\ntype MoveSuffix = \"+\" | \"++\" | \"-\" | \"--\";\n\n// TODO: support recording string locations for moves.\nclass AlgParser {\n #input: string = \"\";\n #idx: number = 0;\n #nissQueue: Grouping[] = [];\n\n parseAlg(input: string): Parsed<Alg> {\n this.#input = input;\n this.#idx = 0;\n const alg = this.parseAlgWithStopping([]);\n this.mustBeAtEndOfInput();\n const algNodes = Array.from(alg.childAlgNodes());\n if (this.#nissQueue.length > 0) {\n for (const nissGrouping of this.#nissQueue.reverse()) {\n algNodes.push(nissGrouping);\n }\n }\n const newAlg = new Alg(algNodes) as Parsed<Alg>;\n const {\n [startCharIndexKey]: startCharIndex,\n [endCharIndexKey]: endCharIndex,\n } = alg;\n addCharIndices(newAlg, startCharIndex, endCharIndex);\n return newAlg;\n }\n\n parseMove(input: string): Parsed<Move> {\n this.#input = input;\n this.#idx = 0;\n const move = this.parseMoveImpl();\n this.mustBeAtEndOfInput();\n return move;\n }\n\n parseQuantumMove(input: string): QuantumMove {\n this.#input = input;\n this.#idx = 0;\n const quantumMove = this.parseQuantumMoveImpl();\n this.mustBeAtEndOfInput();\n return quantumMove;\n }\n\n private mustBeAtEndOfInput() {\n if (this.#idx !== this.#input.length) {\n throw new Error(\"parsing unexpectedly ended early\");\n }\n }\n\n private parseAlgWithStopping(stopBefore: StoppingChar[]): Parsed<Alg> {\n let algStartIdx = this.#idx;\n let algEndIdx = this.#idx;\n const algBuilder = new AlgBuilder();\n\n // We're \"crowded\" if there was not a space or newline since the last alg node.\n let crowded = false;\n\n const mustNotBeCrowded = (idx: number): void => {\n if (crowded) {\n throw new Error(\n `Unexpected character at index ${idx}. Are you missing a space?`,\n ); // TODO better error message\n }\n };\n\n while (this.#idx < this.#input.length) {\n const savedCharIndex = this.#idx;\n if ((stopBefore as string[]).includes(this.#input[this.#idx])) {\n return addCharIndices(algBuilder.toAlg(), algStartIdx, algEndIdx);\n }\n if (this.tryConsumeNext(\" \")) {\n crowded = false;\n if (algBuilder.experimentalNumAlgNodes() === 0) {\n algStartIdx = this.#idx;\n }\n } else if (MOVE_START_REGEX.test(this.#input[this.#idx])) {\n mustNotBeCrowded(savedCharIndex);\n const move = this.parseMoveImpl();\n algBuilder.push(move);\n crowded = true;\n algEndIdx = this.#idx;\n } else if (this.tryConsumeNext(\"(\")) {\n mustNotBeCrowded(savedCharIndex);\n const sq1PairStartMatch = this.tryRegex(SQUARE1_PAIR_START_REGEX);\n if (sq1PairStartMatch) {\n const topAmountString = sq1PairStartMatch[1];\n const savedCharIndexD = this.#idx;\n const sq1PairEndMatch = this.parseRegex(SQUARE1_PAIR_END_REGEX);\n const uMove = addCharIndices(\n new Move(new QuantumMove(\"U_SQ_\"), parseInt(topAmountString, 10)),\n savedCharIndex + 1,\n savedCharIndex + 1 + topAmountString.length,\n );\n const dMove = addCharIndices(\n new Move(\n new QuantumMove(\"D_SQ_\"),\n parseInt(sq1PairEndMatch[1], 10),\n ),\n savedCharIndexD,\n this.#idx - 1,\n );\n const alg = addCharIndices(\n new Alg([uMove, dMove]),\n savedCharIndex + 1,\n this.#idx - 1,\n );\n algBuilder.push(\n addCharIndices(new Grouping(alg), savedCharIndex, this.#idx),\n );\n crowded = true;\n algEndIdx = this.#idx;\n } else {\n const alg = this.parseAlgWithStopping([\")\"]);\n this.mustConsumeNext(\")\");\n const amount = this.parseAmount();\n algBuilder.push(\n addCharIndices(\n new Grouping(alg, amount),\n savedCharIndex,\n this.#idx,\n ),\n );\n crowded = true;\n algEndIdx = this.#idx;\n }\n } else if (this.tryConsumeNext(\"^\")) {\n if (!algDebugGlobals.caretNISSNotationEnabled) {\n throw new Error(\n \"Alg contained a caret but caret NISS notation is not enabled.\",\n );\n }\n\n this.mustConsumeNext(\"(\");\n const alg = this.parseAlgWithStopping([\")\"]);\n this.popNext();\n\n const grouping = new Grouping(alg, -1);\n const placeholder = new Pause();\n\n grouping.experimentalNISSPlaceholder = placeholder;\n placeholder.experimentalNISSGrouping = grouping;\n\n this.#nissQueue.push(grouping);\n algBuilder.push(placeholder);\n } else if (this.tryConsumeNext(\"[\")) {\n mustNotBeCrowded(savedCharIndex);\n const A = this.parseAlgWithStopping([\",\", \":\"]);\n const separator = this.popNext();\n const B = this.parseAlgWithStopping([\"]\"]);\n this.mustConsumeNext(\"]\");\n let unrepeated: Commutator | Conjugate;\n switch (separator) {\n case \":\": {\n unrepeated = addCharIndices(\n new Conjugate(A, B),\n savedCharIndex,\n this.#idx,\n );\n crowded = true;\n algEndIdx = this.#idx;\n break;\n }\n case \",\": {\n unrepeated = addCharIndices(\n new Commutator(A, B),\n savedCharIndex,\n this.#idx,\n );\n crowded = true;\n algEndIdx = this.#idx;\n break;\n }\n default:\n throw new Error(\"unexpected parsing error\");\n }\n const afterClosingBracketIdx = this.#idx;\n const amount = this.parseAmount();\n if (amount === 1) {\n algBuilder.push(unrepeated);\n } else {\n const unrepeatedAlg = addCharIndices(\n new Alg([unrepeated]),\n savedCharIndex,\n afterClosingBracketIdx,\n );\n const grouping = addCharIndices(\n new Grouping(unrepeatedAlg, amount),\n savedCharIndex,\n this.#idx,\n );\n algBuilder.push(grouping);\n }\n crowded = true;\n algEndIdx = this.#idx;\n } else if (this.tryConsumeNext(\"\\n\")) {\n algBuilder.push(\n addCharIndices(new Newline(), savedCharIndex, this.#idx),\n );\n crowded = false;\n algEndIdx = this.#idx;\n } else if (this.tryConsumeNext(\"/\")) {\n if (this.tryConsumeNext(\"/\")) {\n mustNotBeCrowded(savedCharIndex);\n const [text] = this.parseRegex(COMMENT_TEXT_REGEX);\n algBuilder.push(\n addCharIndices(new LineComment(text), savedCharIndex, this.#idx),\n );\n crowded = false;\n algEndIdx = this.#idx;\n } else {\n // We allow crowding here to account for csTimer scrambles, which don't have a space between a Square-1 tuple and the following slash.\n algBuilder.push(\n addCharIndices(new Move(\"_SLASH_\"), savedCharIndex, this.#idx),\n );\n crowded = true;\n algEndIdx = this.#idx;\n }\n } else if (this.tryConsumeNext(\".\")) {\n mustNotBeCrowded(savedCharIndex);\n algBuilder.push(addCharIndices(new Pause(), savedCharIndex, this.#idx));\n crowded = true;\n algEndIdx = this.#idx;\n } else {\n throw new Error(`Unexpected character: ${this.popNext()}`);\n }\n }\n\n if (this.#idx !== this.#input.length) {\n throw new Error(\"did not finish parsing?\");\n }\n if (stopBefore.length > 0) {\n throw new Error(\"expected stopping\");\n }\n return addCharIndices(algBuilder.toAlg(), algStartIdx, algEndIdx);\n }\n\n private parseQuantumMoveImpl(): QuantumMove {\n const [, , , outerLayerStr, innerLayerStr, family] =\n this.parseRegex(QUANTUM_MOVE_REGEX);\n\n return new QuantumMove(\n family,\n parseIntWithEmptyFallback(innerLayerStr, undefined),\n parseIntWithEmptyFallback(outerLayerStr, undefined),\n );\n }\n\n private parseMoveImpl(): Parsed<Move> {\n const savedCharIndex = this.#idx;\n\n if (this.tryConsumeNext(\"/\")) {\n return addCharIndices(new Move(\"_SLASH_\"), savedCharIndex, this.#idx);\n }\n\n let quantumMove = this.parseQuantumMoveImpl();\n // Only `hadEmptyAbsAmount` is `const`.\n let [amount, hadEmptyAbsAmount] = this.parseAmountAndTrackEmptyAbsAmount();\n const suffix = this.parseMoveSuffix();\n\n if (suffix) {\n if (amount < 0) {\n throw new Error(\"uh-oh\");\n }\n if ((suffix === \"++\" || suffix === \"--\") && amount !== 1) {\n // TODO: Handle 1 vs. null\n throw new Error(\n \"Pochmann ++ or -- moves cannot have an amount other than 1.\",\n );\n }\n if ((suffix === \"++\" || suffix === \"--\") && !hadEmptyAbsAmount) {\n throw new Error(\n \"Pochmann ++ or -- moves cannot have an amount written as a number.\",\n );\n }\n if ((suffix === \"+\" || suffix === \"-\") && hadEmptyAbsAmount) {\n throw new Error(\n \"Clock dial moves must have an amount written as a natural number followed by + or -.\",\n );\n }\n if (suffix.startsWith(\"+\")) {\n quantumMove = quantumMove.modified({\n family: `${quantumMove.family}_${\n suffix === \"+\" ? \"PLUS\" : \"PLUSPLUS\"\n }_`, // TODO\n });\n }\n if (suffix.startsWith(\"-\")) {\n quantumMove = quantumMove.modified({\n family: `${quantumMove.family}_${\n suffix === \"-\" ? \"PLUS\" : \"PLUSPLUS\"\n }_`, // TODO\n });\n amount *= -1;\n }\n }\n\n const move = addCharIndices(\n new Move(quantumMove, amount),\n savedCharIndex,\n this.#idx,\n );\n return move;\n }\n\n private parseMoveSuffix(): MoveSuffix | null {\n if (this.tryConsumeNext(\"+\")) {\n if (this.tryConsumeNext(\"+\")) {\n return \"++\";\n }\n return \"+\";\n }\n if (this.tryConsumeNext(\"-\")) {\n if (this.tryConsumeNext(\"-\")) {\n return \"--\";\n }\n return \"-\";\n }\n return null;\n }\n\n private parseAmountAndTrackEmptyAbsAmount(): [number, boolean] {\n const savedIdx = this.#idx;\n const [, absAmountStr, primeStr] = this.parseRegex(AMOUNT_REGEX);\n if (absAmountStr?.startsWith(\"0\") && absAmountStr !== \"0\") {\n throw new Error(\n `Error at char index ${savedIdx}: An amount can only start with 0 if it's exactly the digit 0.`,\n );\n }\n return [\n parseIntWithEmptyFallback(absAmountStr, 1) * (primeStr === \"'\" ? -1 : 1),\n !absAmountStr,\n ];\n }\n\n private parseAmount(): number {\n const savedIdx = this.#idx;\n const [, absAmountStr, primeStr] = this.parseRegex(AMOUNT_REGEX);\n if (absAmountStr?.startsWith(\"0\") && absAmountStr !== \"0\") {\n throw new Error(\n `Error at char index ${savedIdx}: An amount number can only start with 0 if it's exactly the digit 0.`,\n );\n }\n return (\n parseIntWithEmptyFallback(absAmountStr, 1) * (primeStr === \"'\" ? -1 : 1)\n );\n }\n\n private parseRegex(regex: RegExp): RegExpExecArray {\n const arr = regex.exec(this.remaining());\n if (arr === null) {\n throw new Error(\"internal parsing error\"); // TODO\n }\n this.#idx += arr[0].length;\n return arr;\n }\n\n // TOD: can we avoid this?\n private tryRegex(regex: RegExp): RegExpExecArray | null {\n const arr = regex.exec(this.remaining());\n if (arr === null) {\n return null;\n }\n this.#idx += arr[0].length;\n return arr;\n }\n\n private remaining(): string {\n return this.#input.slice(this.#idx);\n }\n\n private popNext(): string {\n const next = this.#input[this.#idx];\n this.#idx++;\n return next;\n }\n\n private tryConsumeNext(expected: string): boolean {\n if (this.#input[this.#idx] === expected) {\n this.#idx++;\n return true;\n }\n return false;\n }\n\n private mustConsumeNext(expected: string): string {\n const next = this.popNext();\n if (next !== expected) {\n throw new Error(\n `expected \\`${expected}\\` while parsing, encountered ${next}`,\n ); // TODO: be more helpful\n }\n return next;\n }\n}\n", "const warned = new Set<string>();\nexport function warnOnce(s: string): void {\n if (!warned.has(s)) {\n console.warn(s);\n warned.add(s);\n }\n}\n", "import type { Repeatable } from \"../common\";\nimport { type IterationDirection, toggleDirection } from \"../iteration\";\nimport { MAX_INT, MAX_INT_DESCRIPTION, MIN_INT } from \"../limits\";\nimport type { AlgLeaf } from \"./AlgNode\";\n\nexport class QuantumWithAmount<Q extends Repeatable> {\n readonly quantum: Q;\n readonly amount: number;\n\n constructor(quantum: Q, amount: number = 1) {\n this.quantum = quantum;\n this.amount = amount;\n\n if (\n !Number.isInteger(this.amount) ||\n this.amount < MIN_INT ||\n this.amount > MAX_INT\n ) {\n throw new Error(\n `AlgNode amount absolute value must be a non-negative integer below ${MAX_INT_DESCRIPTION}.`,\n );\n }\n }\n\n suffix(): string {\n let s: string = \"\";\n // TODO\n const absAmount = Math.abs(this.amount);\n if (absAmount !== 1) {\n s += absAmount;\n }\n if (this.amount < 0) {\n s += \"'\";\n }\n return s;\n }\n\n isIdentical(other: QuantumWithAmount<Q>): boolean {\n return (\n this.quantum.isIdentical(other.quantum) && this.amount === other.amount\n );\n }\n\n // TODO: `Conjugate` and `Commutator` decrement `depth` inside the quantum, `Grouping` has to do it outside the quantum.\n *experimentalExpand(\n iterDir: IterationDirection,\n depth: number,\n ): Generator<AlgLeaf> {\n const absAmount = Math.abs(this.amount);\n const newIterDir = toggleDirection(iterDir, this.amount < 0);\n for (let i = 0; i < absAmount; i++) {\n yield* this.quantum.experimentalExpand(newIterDir, depth);\n }\n }\n}\n", "import type { ExperimentalSerializationOptions } from \"cubing/alg/SerializationOptions\";\nimport { AlgCommon, Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport { MAX_INT, MAX_INT_DESCRIPTION } from \"../../limits\";\nimport { parseMove, parseQuantumMove, transferCharIndex } from \"../../parseAlg\";\nimport { warnOnce } from \"../../warnOnce\";\nimport type { AlgLeaf } from \"../AlgNode\";\nimport { QuantumWithAmount } from \"../QuantumWithAmount\";\n\ninterface QuantumMoveModifications {\n outerLayer?: number;\n innerLayer?: number;\n family?: string;\n}\n\nexport class QuantumMove extends Comparable {\n readonly #family: string;\n readonly #innerLayer: number | null;\n readonly #outerLayer: number | null;\n\n constructor(\n family: string,\n innerLayer?: number | null,\n outerLayer?: number | null,\n ) {\n super();\n this.#family = family;\n this.#innerLayer = innerLayer ?? null;\n this.#outerLayer = outerLayer ?? null;\n Object.freeze(this);\n\n if (\n this.#innerLayer !== null &&\n (!Number.isInteger(this.#innerLayer) ||\n this.#innerLayer < 1 ||\n this.#innerLayer > MAX_INT)\n ) {\n throw new Error(\n `QuantumMove inner layer must be a positive integer below ${MAX_INT_DESCRIPTION}.`,\n );\n }\n\n if (\n this.#outerLayer !== null &&\n (!Number.isInteger(this.#outerLayer) ||\n this.#outerLayer < 1 ||\n this.#outerLayer > MAX_INT)\n ) {\n throw new Error(\n `QuantumMove outer layer must be a positive integer below ${MAX_INT_DESCRIPTION}.`,\n );\n }\n\n if (\n this.#outerLayer !== null &&\n this.#innerLayer !== null &&\n this.#innerLayer <= this.#outerLayer\n ) {\n throw new Error(\n \"QuantumMove outer layer must be smaller than inner layer.\",\n );\n }\n\n if (this.#outerLayer !== null && this.#innerLayer === null) {\n throw new Error(\n \"QuantumMove with an outer layer must have an inner layer\",\n ); // TODO: test\n }\n }\n\n static fromString(s: string): QuantumMove {\n return parseQuantumMove(s);\n }\n\n // TODO: `modify`?\n modified(modifications: QuantumMoveModifications): QuantumMove {\n return new QuantumMove(\n modifications.family ?? this.#family,\n modifications.innerLayer ?? this.#innerLayer,\n modifications.outerLayer ?? this.#outerLayer,\n );\n }\n\n isIdentical(other: QuantumMove): boolean {\n const otherAsQuantumMove = other;\n return (\n other.is(QuantumMove) &&\n this.#family === otherAsQuantumMove.#family &&\n this.#innerLayer === otherAsQuantumMove.#innerLayer &&\n this.#outerLayer === otherAsQuantumMove.#outerLayer\n );\n }\n\n // TODO: provide something more useful on average.\n /** @deprecated */\n get family(): string {\n return this.#family;\n }\n\n // TODO: provide something more useful on average.\n /** @deprecated */\n get outerLayer(): number | null {\n return this.#outerLayer;\n }\n\n // TODO: provide something more useful on average.\n /** @deprecated */\n get innerLayer(): number | null {\n return this.#innerLayer;\n }\n\n experimentalExpand(): Generator<AlgLeaf> {\n throw new Error(\n \"experimentalExpand() cannot be called on a `QuantumMove` directly.\",\n );\n }\n\n override toString(\n _experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n let s = this.#family;\n if (this.#innerLayer !== null) {\n s = String(this.#innerLayer) + s;\n if (this.#outerLayer !== null) {\n s = `${String(this.#outerLayer)}-${s}`;\n }\n }\n return s;\n }\n}\n\nexport interface MoveModifications {\n outerLayer?: number;\n innerLayer?: number;\n family?: string;\n amount?: number;\n}\n\n/** @category Alg Nodes */\nexport class Move extends AlgCommon<Move> {\n // @ts-expect-error False positive due to the `return` in the constructor.\n readonly #quantumWithAmount: QuantumWithAmount<QuantumMove>;\n\n constructor(\n ...args: [QuantumMove] | [QuantumMove, number] | [string] | [string, number]\n ) {\n super();\n if (typeof args[0] === \"string\") {\n if (args[1] ?? null) {\n this.#quantumWithAmount = new QuantumWithAmount(\n QuantumMove.fromString(args[0]),\n args[1],\n );\n return;\n } else {\n // biome-ignore lint/correctness/noConstructorReturn: https://github.com/rome/tools/issues/4005\n return Move.fromString(args[0]);\n }\n }\n this.#quantumWithAmount = new QuantumWithAmount<QuantumMove>(\n args[0],\n args[1],\n );\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsMove = other.as(Move);\n return (\n !!otherAsMove &&\n this.#quantumWithAmount.isIdentical(otherAsMove.#quantumWithAmount)\n );\n }\n\n invert(): Move {\n // TODO: handle char indices more consistently among alg nodes.\n return transferCharIndex(\n this,\n new Move(\n this.#quantumWithAmount.quantum,\n this.#isSlash() ? this.amount : -this.amount,\n ),\n );\n }\n\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n ): Generator<AlgLeaf> {\n if (iterDir === IterationDirection.Forwards) {\n yield this;\n } else {\n yield this.modified({\n amount: -this.amount,\n });\n }\n }\n\n get quantum(): QuantumMove {\n return this.#quantumWithAmount.quantum;\n }\n\n // TODO: `modify`?\n modified(modifications: MoveModifications): Move {\n // TODO: Avoid creating a new quantum move\n return new Move(\n this.#quantumWithAmount.quantum.modified(modifications),\n modifications.amount ?? this.amount,\n );\n }\n\n static fromString(s: string): Move {\n return parseMove(s);\n }\n\n get amount(): number {\n return this.#quantumWithAmount.amount;\n }\n\n /** @deprecated */\n get type(): string {\n warnOnce(\"deprecated: type\");\n return \"blockMove\";\n }\n\n /** @deprecated */\n get family(): string {\n return this.#quantumWithAmount.quantum.family ?? undefined;\n }\n\n /** @deprecated */\n get outerLayer(): number | undefined {\n return this.#quantumWithAmount.quantum.outerLayer ?? undefined;\n }\n\n /** @deprecated */\n get innerLayer(): number | undefined {\n return this.#quantumWithAmount.quantum.innerLayer ?? undefined;\n }\n\n #cachedSlashMove: Move | undefined;\n #isSlash(): boolean {\n return this.isIdentical((this.#cachedSlashMove ??= new Move(\"_SLASH_\")));\n }\n\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n if (experimentalSerializationOptions?.notation !== \"LGN\") {\n if (this.#isSlash()) {\n return \"/\"; // TODO: validate no amount\n }\n if (this.family.endsWith(\"_PLUS_\")) {\n return (\n this.#quantumWithAmount.quantum.toString().slice(0, -6) +\n Math.abs(this.amount) +\n (this.amount < 0 ? \"-\" : \"+\")\n ); // TODO\n }\n if (this.family.endsWith(\"_PLUSPLUS_\")) {\n const absAmount = Math.abs(this.amount);\n return (\n this.#quantumWithAmount.quantum.toString().slice(0, -10) +\n (absAmount === 1 ? \"\" : absAmount) +\n (this.amount < 0 ? \"--\" : \"++\")\n ); // TODO\n }\n }\n return (\n this.#quantumWithAmount.quantum.toString(\n experimentalSerializationOptions,\n ) + this.#quantumWithAmount.suffix()\n );\n }\n // // TODO: Serialize as a string?\n // toJSON(): MoveJSON {\n // return {\n // type: \"move\",\n // family: this.family,\n // innerLayer: this.innerLayer,\n // outerLayer: this.outerLayer,\n // };\n // }\n}\n", "import type { ExperimentalSerializationOptions } from \"cubing/alg/SerializationOptions\";\nimport { Alg, experimentalEnsureAlg, type FlexibleAlgSource } from \"../../Alg\";\nimport { AlgCommon, type Comparable } from \"../../common\";\nimport { IterationDirection } from \"../../iteration\";\nimport { Commutator, Conjugate } from \"..\";\nimport type { AlgLeaf, AlgNode } from \"../AlgNode\";\nimport { Move, QuantumMove } from \"../leaves/Move\";\nimport type { Pause } from \"../leaves/Pause\";\nimport { QuantumWithAmount } from \"../QuantumWithAmount\";\n\n// This is a workaround for `jest`, which doesn't handle cycles of imports inside `cubing/alg`.\n// We need to lazy-initialize the reusable quantum moves for Square-1, so we create this wrapper for it.\nclass Square1TupleFormatter {\n quantumU_SQ_: QuantumMove | null = null;\n quantumD_SQ_: QuantumMove | null = null;\n\n format(\n grouping: Grouping,\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string | null {\n if (experimentalSerializationOptions?.notation === \"LGN\") {\n return null;\n }\n\n if (grouping.amount !== 1) {\n return null;\n }\n const amounts = this.tuple(grouping);\n if (!amounts) {\n return null;\n }\n return `(${amounts.map((move) => move.amount).join(\", \")})`;\n }\n\n tuple(grouping: Grouping): [moveU: Move, moveD: Move] | null {\n if (grouping.amount !== 1) {\n return null;\n }\n\n this.quantumU_SQ_ ||= new QuantumMove(\"U_SQ_\");\n this.quantumD_SQ_ ||= new QuantumMove(\"D_SQ_\");\n\n const quantumAlg = grouping.alg;\n if (quantumAlg.experimentalNumChildAlgNodes() === 2) {\n const [U, D] = quantumAlg.childAlgNodes();\n if (\n U.as(Move)?.quantum.isIdentical(this.quantumU_SQ_) &&\n D.as(Move)?.quantum.isIdentical(this.quantumD_SQ_)\n ) {\n return [U as Move, D as Move]; // TODO: can we reuse the casting from above?\n }\n }\n return null;\n }\n}\nconst square1TupleFormatterInstance = new Square1TupleFormatter();\n\nexport interface GroupingModifications {\n alg?: Alg;\n amount?: number;\n}\n\n/** @category Alg Nodes */\nexport class Grouping extends AlgCommon<Grouping> {\n readonly #quantumWithAmount: QuantumWithAmount<Alg>;\n experimentalNISSPlaceholder?: Pause; // TODO: tie this to the alg\n\n constructor(algSource: FlexibleAlgSource, amount?: number) {\n super();\n const alg = experimentalEnsureAlg(algSource);\n this.#quantumWithAmount = new QuantumWithAmount(alg, amount);\n }\n\n isIdentical(other: Comparable): boolean {\n const otherAsGrouping = other as Grouping;\n return (\n other.is(Grouping) &&\n this.#quantumWithAmount.isIdentical(otherAsGrouping.#quantumWithAmount)\n );\n }\n\n get alg(): Alg {\n return this.#quantumWithAmount.quantum;\n }\n\n get amount(): number {\n return this.#quantumWithAmount.amount;\n }\n\n modified(modifications: GroupingModifications): Grouping {\n return new Grouping(\n modifications.alg ?? this.alg,\n modifications.amount ?? this.amount,\n );\n }\n\n /** @deprecated */\n get experimentalRepetitionSuffix(): string {\n return this.#quantumWithAmount.suffix();\n }\n\n invert(): Grouping {\n const amounts = square1TupleFormatterInstance.tuple(this);\n if (amounts) {\n const [moveU, moveD] = amounts;\n return new Grouping(new Alg([moveU.invert(), moveD.invert()]));\n }\n return new Grouping(\n this.#quantumWithAmount.quantum,\n -this.#quantumWithAmount.amount,\n );\n }\n\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n if (depth === 0) {\n yield iterDir === IterationDirection.Forwards ? this : this.invert();\n } else {\n yield* this.#quantumWithAmount.experimentalExpand(iterDir, depth - 1);\n }\n }\n\n static fromString(): Grouping {\n throw new Error(\"unimplemented\");\n }\n\n #unrepeatedString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string | null {\n const insideString = this.#quantumWithAmount.quantum.toString(\n experimentalSerializationOptions,\n );\n const iter = this.alg.childAlgNodes();\n const { value } = iter.next() as {\n value: AlgNode;\n done: boolean;\n };\n if (iter.next().done && (value?.is(Commutator) || value?.is(Conjugate))) {\n return insideString;\n }\n return `(${insideString})`;\n }\n\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n return (\n square1TupleFormatterInstance.format(\n this,\n experimentalSerializationOptions,\n ) ??\n `${this.#unrepeatedString(experimentalSerializationOptions)}${this.#quantumWithAmount.suffix()}`\n );\n }\n\n experimentalAsSquare1Tuple(): [moveU: Move, moveD: Move] | null {\n return square1TupleFormatterInstance.tuple(this);\n }\n // toJSON(): GroupingJSON {\n // return {\n // type: \"grouping\",\n // alg: this.#quanta.quantum.toJSON(),\n // };\n // }\n}\n", "import type { Alg } from \"./Alg\";\nimport {\n Commutator,\n Conjugate,\n Grouping,\n LineComment,\n Move,\n Newline,\n Pause,\n} from \"./alg-nodes\";\n\nexport function experimentalIs(\n v: any,\n c:\n | typeof Alg\n | typeof Grouping\n | typeof LineComment\n | typeof Commutator\n | typeof Conjugate\n | typeof Move\n | typeof Newline\n | typeof Pause,\n): boolean {\n return v instanceof c;\n}\nexport function experimentalIsAlgNode(v: any): boolean {\n return (\n experimentalIs(v, Grouping) ||\n experimentalIs(v, LineComment) ||\n experimentalIs(v, Commutator) ||\n experimentalIs(v, Conjugate) ||\n experimentalIs(v, Move) ||\n experimentalIs(v, Newline) ||\n experimentalIs(v, Pause)\n );\n}\n", "import type { Move, QuantumMove } from \"../alg-nodes\";\n\n// TODO: enums?\nconst DEFAULT_DIRECTIONAL = \"any-direction\";\nDEFAULT_DIRECTIONAL;\nexport type QuantumDirectionalCancellation =\n | typeof DEFAULT_DIRECTIONAL // Cancel any moves with the same quantum.\n | \"same-direction\" // Cancel two quantums when have non-zero amounts of the same sign (positive/negative). An amount of 0 always counts as the same direction as any other amount.\n | \"none\";\n\n// Example input: `R7' . R6' . R5' . R6` on a cube.\nexport type ModWrap =\n | \"none\" // R7' . R6' . R5' . R6\n | \"gravity\" // R . R2' . R' . R2\n | \"canonical-centered\" // R . R2 . R' . R2\n | \"canonical-positive\" // R . R2 . R3 . R2\n | \"preserve-sign\"; // R3' . R2' . R' . R2\n\nexport interface AppendCancelOptions {\n directional?: QuantumDirectionalCancellation;\n puzzleSpecificModWrap?: ModWrap; // Default depends on `directional`\n}\n\n// TODO: preserve single moves even when amount is 0?\nexport interface AppendOptions {\n cancel?: boolean | AppendCancelOptions; // Set to `true` to use future-proof defaults.\n // Takes precedence over the direct `puzzleSpecificSimplifyOptions` field.\n puzzleLoader?: {\n puzzleSpecificSimplifyOptions?: PuzzleSpecificSimplifyOptions;\n };\n puzzleSpecificSimplifyOptions?: PuzzleSpecificSimplifyOptions;\n}\n\nexport class AppendOptionsHelper {\n constructor(private config: AppendOptions = {}) {}\n\n cancelQuantum(): QuantumDirectionalCancellation {\n const { cancel } = this.config;\n if (cancel === true) {\n return DEFAULT_DIRECTIONAL;\n }\n if (cancel === false) {\n return \"none\";\n }\n return cancel?.directional ?? \"none\";\n }\n\n cancelAny() {\n return this.config.cancel && this.cancelQuantum() !== \"none\";\n }\n\n cancelPuzzleSpecificModWrap(): ModWrap {\n const { cancel } = this.config;\n if (cancel === true || cancel === false) {\n return \"canonical-centered\";\n }\n if (cancel?.puzzleSpecificModWrap) {\n return cancel?.puzzleSpecificModWrap;\n }\n return cancel?.directional === \"same-direction\"\n ? \"preserve-sign\"\n : \"canonical-centered\";\n }\n\n puzzleSpecificSimplifyOptions(): PuzzleSpecificSimplifyOptions | undefined {\n return (\n this.config.puzzleLoader?.puzzleSpecificSimplifyOptions ??\n this.config.puzzleSpecificSimplifyOptions\n );\n }\n}\n\nexport interface SimplifyOptions extends AppendOptions {\n depth?: number | null; // TODO: test\n}\n\nexport interface PuzzleSpecificAxisSimplifyInfo {\n // All moves on the same axis *must* commute.\n areQuantumMovesSameAxis: (\n quantumMove1: QuantumMove,\n quantumMove2: QuantumMove,\n ) => boolean;\n simplifySameAxisMoves: (moves: Move[], quantumMod: boolean) => Move[];\n}\n\n// TODO: allow \"normal\" \"twisty\" puzzles to hardcode axis concepts without hardcoding too much in `Alg` that's not relevant to all puzzles.\nexport interface PuzzleSpecificSimplifyOptions {\n quantumMoveOrder?: (quantumMove: QuantumMove) => number;\n // TODO: implement cancellation for non-axis commuting moves (e.g. Megaminx: `BL R BL'` \u2192 `R`)\n // // Commutation is not transitive. For example, on Megaminx: BR and BL both commute with F, but not with each other.\n // doQuantumMovesCommute?: (\n // quantumMove1: QuantumMove,\n // quantumMove2: QuantumMove,\n // ) => boolean;\n axis?: PuzzleSpecificAxisSimplifyInfo;\n}\n", "import { Alg } from \"../Alg\";\nimport type { AlgNode } from \"../alg-nodes\";\nimport type { AlgLeaf } from \"../alg-nodes/AlgNode\";\nimport { Move } from \"../alg-nodes/leaves/Move\";\nimport { type AppendOptions, AppendOptionsHelper } from \"./options\";\n\nfunction areSameDirection(direction: -1 | 1, move2: Move): boolean {\n // This multiplication has two properties:\n // - If either amount is 0, returns true.\n // - Otherwise, the signs have to match.\n return direction * Math.sign(move2.amount) >= 0;\n}\n\nexport function offsetMod(\n x: number,\n positiveMod: number,\n offset: number = 0,\n): number {\n return ((((x - offset) % positiveMod) + positiveMod) % positiveMod) + offset;\n}\n\nexport function experimentalAppendMove(\n alg: Alg,\n addedMove: Move,\n options?: AppendOptions,\n): Alg {\n const optionsHelper = new AppendOptionsHelper(options);\n\n const outputPrefix: AlgNode[] = Array.from(alg.childAlgNodes());\n let outputSuffix: Move[] = [addedMove];\n function output() {\n return new Alg([...outputPrefix, ...outputSuffix]); // TODO: What's the most efficient way to do this?\n }\n\n function modMove(move: Move): Move {\n if (optionsHelper.cancelPuzzleSpecificModWrap() === \"none\") {\n return move;\n }\n const quantumMoveOrder =\n optionsHelper.puzzleSpecificSimplifyOptions()?.quantumMoveOrder;\n if (!quantumMoveOrder) {\n return move;\n }\n const mod = quantumMoveOrder(addedMove.quantum)!; // TODO: throw if `undefined`?\n let offset: number;\n switch (optionsHelper.cancelPuzzleSpecificModWrap()) {\n case \"gravity\": {\n offset = -Math.floor((mod - (move.amount < 0 ? 0 : 1)) / 2); // TODO: dedup this calculation for the most common path?\n break;\n }\n case \"canonical-centered\": {\n offset = -Math.floor((mod - 1) / 2); // TODO: dedup this calculation for the most common path?\n break;\n }\n case \"canonical-positive\": {\n offset = 0;\n break;\n }\n case \"preserve-sign\": {\n offset = move.amount < 0 ? 1 - mod : 0;\n break;\n }\n default: {\n throw new Error(\"Unknown mod wrap\");\n }\n }\n const offsetAmount = offsetMod(move.amount, mod, offset);\n return move.modified({ amount: offsetAmount });\n }\n\n if (optionsHelper.cancelAny()) {\n let canCancelMoveBasedOnQuantum: (move: Move) => boolean;\n const axis = optionsHelper.puzzleSpecificSimplifyOptions()?.axis;\n if (axis) {\n canCancelMoveBasedOnQuantum = (move: Move): boolean =>\n axis.areQuantumMovesSameAxis(addedMove.quantum, move.quantum);\n } else {\n const newMoveQuantumString = addedMove.quantum.toString();\n canCancelMoveBasedOnQuantum = (move: Move): boolean =>\n move.quantum.toString() === newMoveQuantumString;\n }\n\n const sameDirectionOnly =\n optionsHelper.cancelQuantum() === \"same-direction\";\n\n const quantumDirections = new Map<string, 1 | 0 | -1>();\n quantumDirections.set(\n addedMove.quantum.toString(),\n Math.sign(addedMove.amount) as -1 | 0 | 1,\n );\n let i: number;\n for (i = outputPrefix.length - 1; i >= 0; i--) {\n const move = outputPrefix[i].as(Move);\n if (!move) {\n break;\n }\n if (!canCancelMoveBasedOnQuantum(move)) {\n break;\n }\n const quantumKey = move.quantum.toString();\n if (sameDirectionOnly) {\n const existingQuantumDirectionOnAxis =\n quantumDirections.get(quantumKey);\n if (\n existingQuantumDirectionOnAxis && // Short-circuits, but that's actually okay here.\n !areSameDirection(existingQuantumDirectionOnAxis, move)\n ) {\n break;\n }\n quantumDirections.set(quantumKey, Math.sign(move.amount) as -1 | 0 | 1);\n }\n }\n const suffix = [...(outputPrefix.splice(i + 1) as Move[]), addedMove];\n\n if (axis) {\n // TODO: pass down quantum mod\n outputSuffix = axis.simplifySameAxisMoves(\n suffix,\n optionsHelper.cancelPuzzleSpecificModWrap() !== \"none\",\n );\n } else {\n const amount = suffix.reduce(\n (sum: number, move: Move) => sum + move.amount,\n 0,\n );\n if (quantumDirections.size !== 1) {\n throw new Error(\n \"Internal error: multiple quantums when one was expected\",\n );\n }\n outputSuffix = [new Move(addedMove.quantum, amount)];\n }\n }\n outputSuffix = outputSuffix\n .map((m) => modMove(m))\n .filter((move: Move) => move.amount !== 0);\n return output();\n}\n\nexport function experimentalAppendNode(\n alg: Alg,\n leaf: AlgLeaf,\n options: AppendOptions,\n): Alg {\n const maybeMove = leaf.as(Move);\n if (maybeMove) {\n return experimentalAppendMove(alg, maybeMove, options);\n } else {\n return new Alg([...alg.childAlgNodes(), leaf]);\n }\n}\n", "import type { Alg } from \"./Alg\";\nimport type { AlgNode } from \"./alg-nodes/AlgNode\";\nimport { Commutator } from \"./alg-nodes/containers/Commutator\";\nimport { Conjugate } from \"./alg-nodes/containers/Conjugate\";\nimport { Grouping } from \"./alg-nodes/containers/Grouping\";\nimport { LineComment } from \"./alg-nodes/leaves/LineComment\";\nimport { Move } from \"./alg-nodes/leaves/Move\";\nimport { Newline } from \"./alg-nodes/leaves/Newline\";\nimport { Pause } from \"./alg-nodes/leaves/Pause\";\nimport type { Comparable } from \"./common\";\n\nfunction dispatch<DataDown, DataAlgUp, DataAlgNodeUp>(\n t: TraversalDownUp<DataDown, DataAlgUp, DataAlgNodeUp>,\n algNode: AlgNode,\n dataDown: DataDown,\n): DataAlgNodeUp {\n // TODO: Can we turn this back into a `switch` or something more efficiently?\n if (algNode.is(Grouping)) {\n return t.traverseGrouping(algNode as Grouping, dataDown);\n }\n if (algNode.is(Move)) {\n return t.traverseMove(algNode as Move, dataDown);\n }\n if (algNode.is(Commutator)) {\n return t.traverseCommutator(algNode as Commutator, dataDown);\n }\n if (algNode.is(Conjugate)) {\n return t.traverseConjugate(algNode as Conjugate, dataDown);\n }\n if (algNode.is(Pause)) {\n return t.traversePause(algNode as Pause, dataDown);\n }\n if (algNode.is(Newline)) {\n return t.traverseNewline(algNode as Newline, dataDown);\n }\n if (algNode.is(LineComment)) {\n return t.traverseLineComment(algNode as LineComment, dataDown);\n }\n throw new Error(\"unknown AlgNode\");\n}\n\nfunction mustBeAlgNode(t: Comparable): AlgNode {\n if (\n t.is(Grouping) ||\n t.is(Move) ||\n t.is(Commutator) ||\n t.is(Conjugate) ||\n t.is(Pause) ||\n t.is(Newline) ||\n t.is(LineComment)\n ) {\n return t as AlgNode;\n }\n throw new Error(\"internal error: expected AlgNode\"); // TODO: Make more helpful, add tests\n}\n\nexport abstract class TraversalDownUp<\n DataDown,\n DataAlgUp,\n DataAlgNodeUp = DataAlgUp,\n> {\n // Immediate subclasses should overwrite this.\n public traverseAlgNode(algNode: AlgNode, dataDown: DataDown): DataAlgNodeUp {\n return dispatch(this, algNode, dataDown);\n }\n\n public traverseIntoAlgNode(algNode: AlgNode, dataDown: DataDown): AlgNode {\n return mustBeAlgNode(this.traverseAlgNode(algNode, dataDown) as any);\n }\n\n public abstract traverseAlg(alg: Alg, dataDown: DataDown): DataAlgUp;\n\n public abstract traverseGrouping(\n grouping: Grouping,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traverseMove(move: Move, dataDown: DataDown): DataAlgNodeUp;\n\n public abstract traverseCommutator(\n commutator: Commutator,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traverseConjugate(\n conjugate: Conjugate,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traversePause(\n pause: Pause,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n public abstract traverseNewline(\n newline: Newline,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n\n public abstract traverseLineComment(\n comment: LineComment,\n dataDown: DataDown,\n ): DataAlgNodeUp;\n}\n\nexport abstract class TraversalUp<\n DataAlgUp,\n DataAlgNodeUp = DataAlgUp,\n> extends TraversalDownUp<undefined, DataAlgUp, DataAlgNodeUp> {\n public override traverseAlgNode(algNode: AlgNode): DataAlgNodeUp {\n return dispatch<unknown, DataAlgUp, DataAlgNodeUp>(\n this,\n algNode,\n undefined,\n );\n }\n\n public override traverseIntoAlgNode(algNode: AlgNode): AlgNode {\n return mustBeAlgNode(this.traverseAlgNode(algNode) as any);\n }\n\n public abstract override traverseAlg(alg: Alg): DataAlgUp;\n public abstract override traverseGrouping(grouping: Grouping): DataAlgNodeUp;\n public abstract override traverseMove(move: Move): DataAlgNodeUp;\n public abstract override traverseCommutator(\n commutator: Commutator,\n ): DataAlgNodeUp;\n public abstract override traverseConjugate(\n conjugate: Conjugate,\n ): DataAlgNodeUp;\n public abstract override traversePause(pause: Pause): DataAlgNodeUp;\n public abstract override traverseNewline(newline: Newline): DataAlgNodeUp;\n public abstract override traverseLineComment(\n comment: LineComment,\n ): DataAlgNodeUp;\n}\n\nexport function functionFromTraversal<\n DataDown,\n DataAlgUp,\n ConstructorArgs extends unknown[],\n>(\n traversalConstructor: {\n new (...args: ConstructorArgs): TraversalDownUp<DataDown, DataAlgUp, any>;\n },\n constructorArgs?: ConstructorArgs,\n): undefined extends DataDown\n ? (alg: Alg) => DataAlgUp\n : (alg: Alg, v: DataDown) => DataAlgUp {\n const instance = new traversalConstructor(\n ...(constructorArgs ?? ([] as any)),\n );\n return instance.traverseAlg.bind(instance) as any;\n}\n", "import { Alg } from \"../Alg\";\nimport type { AlgNode } from \"../alg-nodes/AlgNode\";\nimport { Commutator } from \"../alg-nodes/containers/Commutator\";\nimport { Conjugate } from \"../alg-nodes/containers/Conjugate\";\nimport { Grouping } from \"../alg-nodes/containers/Grouping\";\nimport type { LineComment } from \"../alg-nodes/leaves/LineComment\";\nimport { Move } from \"../alg-nodes/leaves/Move\";\nimport type { Newline } from \"../alg-nodes/leaves/Newline\";\nimport { Pause } from \"../alg-nodes/leaves/Pause\";\nimport { functionFromTraversal, TraversalDownUp } from \"../traversal\";\nimport { experimentalAppendNode } from \"./append\";\nimport { AppendOptionsHelper, type SimplifyOptions } from \"./options\";\n\n// TODO: Test that inverses are bijections.\nclass Simplify extends TraversalDownUp<SimplifyOptions, Generator<AlgNode>> {\n #newPlaceholderAssociationsMap?: Map<Grouping, Pause>;\n #newPlaceholderAssociations(): Map<Grouping, Pause> {\n return (this.#newPlaceholderAssociationsMap ??= new Map<Grouping, Pause>());\n }\n\n // TODO: avoid allocations?\n #descendOptions(options: SimplifyOptions): SimplifyOptions {\n return {\n ...options,\n depth: options.depth ? options.depth - 1 : null,\n };\n }\n\n // TODO: Handle\n public *traverseAlg(alg: Alg, options: SimplifyOptions): Generator<AlgNode> {\n if (options.depth === 0) {\n yield* alg.childAlgNodes();\n return;\n }\n\n let output: AlgNode[] = [];\n\n const newOptions: SimplifyOptions = this.#descendOptions(options); // TODO: avoid allocations?\n for (const algNode of alg.childAlgNodes()) {\n for (const traversedNode of this.traverseAlgNode(algNode, newOptions)) {\n output = Array.from(\n experimentalAppendNode(\n new Alg(output),\n traversedNode,\n newOptions,\n ).childAlgNodes(),\n );\n }\n }\n\n // TODO: try to use `yield* output[Symbol.iterator]();`?\n for (const newAlgNode of output) {\n yield newAlgNode;\n }\n }\n\n public *traverseGrouping(\n grouping: Grouping,\n options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (options.depth === 0) {\n yield grouping;\n return;\n }\n if (grouping.amount === 0) {\n // TODO: Are we okay with throwing away nested comments?\n return;\n }\n const newGrouping = new Grouping(\n this.traverseAlg(grouping.alg, this.#descendOptions(options)),\n grouping.amount,\n );\n if (newGrouping.alg.experimentalIsEmpty()) {\n return;\n }\n\n const newPlaceholder = this.#newPlaceholderAssociations().get(grouping);\n if (newPlaceholder) {\n newGrouping.experimentalNISSPlaceholder = newPlaceholder;\n newPlaceholder.experimentalNISSGrouping = newGrouping;\n }\n\n yield newGrouping;\n }\n\n public *traverseMove(\n move: Move,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n yield move;\n }\n\n #doChildrenCommute(A: Alg, B: Alg, options: SimplifyOptions): boolean {\n if (\n A.experimentalNumChildAlgNodes() === 1 &&\n B.experimentalNumChildAlgNodes() === 1\n ) {\n // Handle the special case where each side has been reduced to a single move.\n const aMove = Array.from(A.childAlgNodes())[0]?.as(Move);\n const bMove = Array.from(B.childAlgNodes())[0]?.as(Move);\n if (!(aMove && bMove)) {\n return false;\n }\n if (bMove.quantum.isIdentical(aMove.quantum)) {\n return true;\n }\n const appendOptionsHelper = new AppendOptionsHelper(options); // TODO: avoid re-allocating every time.\n if (\n appendOptionsHelper\n .puzzleSpecificSimplifyOptions()\n ?.axis?.areQuantumMovesSameAxis(aMove.quantum, bMove.quantum)\n ) {\n return true;\n }\n }\n return false;\n }\n\n public *traverseCommutator(\n commutator: Commutator,\n options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (options.depth === 0) {\n yield commutator;\n return;\n }\n const newOptions = this.#descendOptions(options);\n const newCommutator = new Commutator(\n this.traverseAlg(commutator.A, newOptions),\n this.traverseAlg(commutator.B, newOptions),\n );\n if (\n newCommutator.A.experimentalIsEmpty() ||\n newCommutator.B.experimentalIsEmpty() ||\n newCommutator.A.isIdentical(newCommutator.B) ||\n newCommutator.A.isIdentical(newCommutator.B.invert()) ||\n this.#doChildrenCommute(newCommutator.A, newCommutator.B, options)\n ) {\n return;\n }\n yield newCommutator;\n }\n\n public *traverseConjugate(\n conjugate: Conjugate,\n options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (options.depth === 0) {\n yield conjugate;\n return;\n }\n const newOptions = this.#descendOptions(options);\n const newConjugate = new Conjugate(\n this.traverseAlg(conjugate.A, newOptions),\n this.traverseAlg(conjugate.B, newOptions),\n );\n if (newConjugate.B.experimentalIsEmpty()) {\n return;\n }\n if (\n newConjugate.A.experimentalIsEmpty() ||\n newConjugate.A.isIdentical(newConjugate.B) ||\n newConjugate.A.isIdentical(newConjugate.B.invert()) ||\n this.#doChildrenCommute(newConjugate.A, newConjugate.B, options)\n ) {\n yield* conjugate.B.childAlgNodes();\n return;\n }\n yield newConjugate;\n }\n\n public *traversePause(\n pause: Pause,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n if (pause.experimentalNISSGrouping) {\n const newPause = new Pause();\n this.#newPlaceholderAssociations().set(\n pause.experimentalNISSGrouping,\n newPause,\n );\n yield newPause;\n } else {\n yield pause;\n }\n }\n\n public *traverseNewline(\n newline: Newline,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n yield newline;\n }\n\n public *traverseLineComment(\n comment: LineComment,\n _options: SimplifyOptions,\n ): Generator<AlgNode> {\n yield comment;\n }\n}\n\nexport const simplify = functionFromTraversal(Simplify);\n", "// https://js.cubing.net/cubing/alg/\n\nimport { Grouping, Pause } from \"./alg-nodes\";\nimport type { AlgLeaf, AlgNode } from \"./alg-nodes/AlgNode\";\nimport { LineComment } from \"./alg-nodes/leaves/LineComment\";\nimport { Move } from \"./alg-nodes/leaves/Move\";\nimport { Newline } from \"./alg-nodes/leaves/Newline\";\nimport { AlgCommon, type Comparable } from \"./common\";\nimport { experimentalIs, experimentalIsAlgNode } from \"./is\";\nimport { direct, IterationDirection, reverse } from \"./iteration\";\nimport { parseAlg } from \"./parseAlg\";\nimport type { ExperimentalSerializationOptions } from \"./SerializationOptions\";\nimport { type SimplifyOptions, simplify } from \"./simplify\";\nimport { warnOnce } from \"./warnOnce\";\n\nexport type FlexibleAlgSource = string | Iterable<AlgNode> | Alg;\n\n// TODO: validate\nfunction toIterable(input?: FlexibleAlgSource): Iterable<AlgNode> {\n if (!input) {\n return [];\n }\n\n if (experimentalIs(input, Alg)) {\n return (input as Alg).childAlgNodes();\n }\n\n if (typeof input === \"string\") {\n return parseAlg(input).childAlgNodes(); // TODO: something more direct?\n }\n\n const iter = input as Iterable<AlgNode>;\n if (typeof iter[Symbol.iterator] === \"function\") {\n return iter; // TODO: avoid allocations\n }\n\n throw new Error(\"Invalid AlgNode\");\n}\n\n// Preserves the alg if it's already an `Alg`.\nexport function experimentalEnsureAlg(alg: FlexibleAlgSource): Alg {\n if (experimentalIs(alg, Alg)) {\n return alg as Alg;\n }\n return new Alg(alg);\n}\n\n/**\n * `Alg` is a class that encapsulates a structured alg. To create an `Alg` from a string, use:\n *\n * new Alg(\"R U R'\"); // Convenient\n * Alg.fromString(dynamicString); // Recommended when the string input is user-provided.\n *\n * Once you have an `Alg`, you can call methods to transform it:\n *\n * new Alg(\"[[R: U], R U R2']\").expand().experimentalSimplify({cancel: true}).invert().log()\n *\n * To convert an `Alg` to a string, use .toString():\n *\n * new Alg(\"R U F\").invert().toString();\n *\n * If you need to debug, you may also find it convenient to use .log():\n *\n * if (alg.isIdentical(alg.invert())) {\n * alg.log(\"A self-inverse!\")\n * }\n *\n * For more information, see: {@link https://js.cubing.net/cubing/alg/}\n *\n * @category Alg\n */\nexport class Alg extends AlgCommon<Alg> {\n // #debugString: string;\n #algNodes: Iterable<AlgNode>; // TODO: freeze?\n constructor(alg?: FlexibleAlgSource) {\n super();\n this.#algNodes = Array.from(toIterable(alg)); // TODO: can we avoid array-casting?\n // this.#debugString = this.toString();\n\n for (const algNode of this.#algNodes) {\n if (!experimentalIsAlgNode(algNode)) {\n throw new Error(\"An alg can only contain alg nodes.\");\n }\n }\n }\n\n /**\n * Checks whether this Alg is structurally identical to another Alg. This\n * essentially means that they are written identically apart from whitespace.\n *\n * const alg1 = new Alg(\"R U L'\");\n * const alg2 = new Alg(\"L U' R'\").invert();\n * // true\n * alg1.isIdentical(alg2);\n *\n * // false\n * new Alg(\"[R, U]\").isIdentical(new Alg(\"R U R' U'\"));\n * // true\n * new Alg(\"[R, U]\").expand().isIdentical(new Alg(\"R U R' U'\"));\n *\n * Note that .isIdentical() efficiently compares algorithms, but mainly exists\n * to help optimize code when the structure of an algorithm hasn't changed.\n * There are many ways to write the \"same\" alg on most puzzles, but is\n * *highly* recommended to avoid expanding two Alg instances to compare them,\n * since that can easily slow your program to a crawl if someone inputs an alg\n * containing a large repetition. In general, you should use `cubing/kpuzzle`\n * to compare if two algs have the same effect on a puzzle.\n *\n * Also note that parser annotations are not taken into account while comparing\n * algs:\n *\n * const alg = new Alg([new Move(\"R\"), new Move(\"U2\")]);\n * // true, even though one of the algs has parser annotations\n * alg.isIdentical(new Alg(\"R U2\"))\n *\n */\n isIdentical(other: Comparable): boolean {\n const otherAsAlg = other as Alg;\n if (!other.is(Alg)) {\n return false;\n }\n\n // TODO: avoid converting to array\n const l1 = Array.from(this.#algNodes);\n const l2 = Array.from(otherAsAlg.#algNodes);\n if (l1.length !== l2.length) {\n return false;\n }\n for (let i = 0; i < l1.length; i++) {\n if (!l1[i].isIdentical(l2[i])) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Returns the inverse of the given alg.\n *\n * Note that that this does not make any assumptions about what puzzle the alg\n * is for. For example, U2 is its own inverse on a cube, but U2' has the same\n * effect U3 (and not U2) on Megaminx:\n *\n * // Outputs: R U2' L'\n * new Alg(\"L U2 R'\").invert().log();\n */\n invert(): Alg {\n // TODO: Handle newLines and comments correctly\n // TODO: Make more efficient.\n return new Alg(reverse(Array.from(this.#algNodes).map((u) => u.invert())));\n }\n\n /** @deprecated Use {@link Alg.expand} instead. */\n *experimentalExpand(\n iterDir: IterationDirection = IterationDirection.Forwards,\n depth?: number,\n ): Generator<AlgLeaf> {\n depth ??= Infinity;\n for (const algNode of direct(this.#algNodes, iterDir)) {\n yield* algNode.experimentalExpand(iterDir, depth);\n }\n }\n\n /**\n * Expands all Grouping, Commutator, and Conjugate parts nested inside the\n * alg.\n *\n * // F R U R' U' F'\n * new Alg(\"[F: [R, U]]\").expand().log();\n *\n * // F [R, U] F'\n * new Alg(\"[F: [R, U]]\").expand(({ depth: 1 }).log();\n *\n * Avoid calling this on a user-provided alg unless the user explicitly asks\n * to see the expanded alg. Otherwise, it's easy to make your program freeze\n * when someone passes in an alg like: (R U)10000000\n *\n * Generally, if you want to perform an operation on an entire alg, you'll\n * want to use something based on the `Traversal` mechanism, like countMoves()\n * from `cubing/notation`.\n */\n expand(options?: { depth?: number }): Alg {\n return new Alg(\n this.experimentalExpand(\n IterationDirection.Forwards,\n options?.depth ?? Infinity,\n ),\n );\n }\n\n /** @deprecated */\n *experimentalLeafMoves(): Generator<Move> {\n for (const leaf of this.experimentalExpand()) {\n if (leaf.is(Move)) {\n yield leaf as Move;\n }\n }\n }\n\n concat(input: FlexibleAlgSource): Alg {\n return new Alg(\n Array.from(this.#algNodes).concat(Array.from(toIterable(input))),\n );\n }\n\n /** @deprecated */\n experimentalIsEmpty(): boolean {\n for (const _ of this.#algNodes) {\n return false;\n }\n return true;\n }\n\n static fromString(s: string): Alg {\n return parseAlg(s);\n }\n\n /** @deprecated */\n units(): Generator<AlgNode> {\n return this.childAlgNodes();\n }\n\n *childAlgNodes(): Generator<AlgNode> {\n for (const algNode of this.#algNodes) {\n yield algNode;\n }\n }\n\n /** @deprecated */\n experimentalNumUnits(): number {\n return this.experimentalNumChildAlgNodes();\n }\n\n experimentalNumChildAlgNodes(): number {\n return Array.from(this.#algNodes).length;\n }\n\n /** @deprecated */\n get type(): string {\n warnOnce(\"deprecated: type\");\n return \"sequence\";\n }\n\n /**\n * Converts the Alg to a string:\n *\n * const alg = new Alg([new Move(\"R\"), new Move(\"U2\"), new Move(\"L\")])\n * // R U2 L\n * console.log(alg.toString())\n */\n toString(\n experimentalSerializationOptions?: ExperimentalSerializationOptions,\n ): string {\n let output = \"\";\n let previousVisibleAlgNode: AlgNode | null = null;\n for (const algNode of this.#algNodes) {\n if (previousVisibleAlgNode) {\n output += spaceBetween(previousVisibleAlgNode, algNode);\n }\n const nissGrouping = algNode.as(Pause)?.experimentalNISSGrouping;\n if (nissGrouping) {\n if (nissGrouping.amount !== -1) {\n throw new Error(\"Invalid NISS Grouping amount!\");\n }\n output += `^(${nissGrouping.alg.toString(experimentalSerializationOptions)})`;\n } else if (algNode.as(Grouping)?.experimentalNISSPlaceholder) {\n // do not serialize (rely on the placeholder instead)\n } else {\n output += algNode.toString(experimentalSerializationOptions);\n }\n previousVisibleAlgNode = algNode;\n }\n return output;\n }\n\n /**\n * `experimentalSimplify` can perform several mostly-syntactic simplifications on an alg:\n *\n * // Logs: R' U3\n * import { Alg } from \"cubing/alg\";\n * new Alg(\"R R2' U U2\").experimentalSimplify({ cancel: true }).log()\n *\n * You can pass in a `PuzzleLoader` (currently only for 3x3x3) for puzzle-specific simplifications:\n *\n * // Logs: R' U'\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n * new Alg(\"R R2' U U2\").experimentalSimplify({ cancel: true, puzzleLoader: cube3x3x3 }).log()\n *\n * You can also cancel only moves that are in the same direction:\n *\n * // Logs: R R2' U'\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n * new Alg(\"R R2' U U2\").experimentalSimplify({\n * cancel: { directional: \"same-direction\" },\n * puzzleLoader: cube3x3x3\n * }).log()\n *\n * Additionally, you can specify how moves are \"wrapped\":\n *\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n *\n * function example(puzzleSpecificModWrap) {\n * alg.experimentalSimplify({\n * cancel: { puzzleSpecificModWrap },\n * puzzleLoader: cube3x3x3\n * }).log()\n * }\n *\n * const alg = new Alg(\"R7' . R6' . R5' . R6\")\n * example(\"none\") // R7' . R6' . R5' . R6\n * example(\"gravity\") // R . R2' . R' . R2\n * example(\"canonical-centered\") // R . R2 . R' . R2\n * example(\"canonical-positive\") // R . R2 . R3 . R2\n * example(\"preserve-sign\") // R3' . R2' . R' . R2\n *\n * Same-axis and simultaneous move canonicalization is not implemented yet:\n *\n * // Logs: R L R\n * import { Alg } from \"cubing/alg\";\n * import { cube3x3x3 } from \"cubing/puzzles\";\n * new Alg(\"R L R\").experimentalSimplify({ cancel: true, puzzleLoader: cube3x3x3 }).log()\n */\n experimentalSimplify(options?: SimplifyOptions): Alg {\n return new Alg(simplify(this, options ?? {}));\n }\n\n /** @deprecated See {@link experimentalSimplify} */\n simplify(options?: SimplifyOptions): Alg {\n return this.experimentalSimplify(options);\n }\n}\n\nfunction spaceBetween(u1: AlgNode, u2: AlgNode): string {\n if (u1.is(Newline) || u2.is(Newline)) {\n return \"\";\n }\n if (u2.as(Grouping)?.experimentalNISSPlaceholder) {\n return \"\";\n }\n if (u1.is(LineComment) && !u2.is(Newline)) {\n return \"\\n\"; /// TODO\n }\n return \" \";\n}\n", "// tslint:disable-next-line no-namespace // TODO: nested module\n\nimport { Alg } from \"./Alg\";\nimport { Grouping } from \"./alg-nodes\";\nimport { Commutator } from \"./alg-nodes/containers/Commutator\";\nimport { Conjugate } from \"./alg-nodes/containers/Conjugate\";\nimport { Move } from \"./alg-nodes/leaves/Move\";\nimport { Pause } from \"./alg-nodes/leaves/Pause\";\n\nexport const Example = {\n Sune: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"U\", 1),\n new Move(\"R\", 1),\n new Move(\"U\", -2),\n new Move(\"R\", -1),\n ]),\n\n AntiSune: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", 2),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"R\", 1),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n ]),\n\n SuneCommutator: new Alg([\n new Commutator(\n new Alg([new Move(\"R\", 1), new Move(\"U\", 1), new Move(\"R\", -2)]),\n new Alg([\n new Conjugate(new Alg([new Move(\"R\", 1)]), new Alg([new Move(\"U\", 1)])),\n ]),\n ),\n ]),\n\n Niklas: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", -1),\n new Move(\"L\", -1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"L\", 1),\n new Move(\"U\", 1),\n ]),\n\n EPerm: new Alg([\n new Move(\"x\", -1),\n new Commutator(\n new Alg([\n new Conjugate(\n new Alg([new Move(\"R\", 1)]),\n new Alg([new Move(\"U\", -1)]),\n ),\n ]),\n new Alg([new Move(\"D\", 1)]),\n ),\n new Commutator(\n new Alg([\n new Conjugate(new Alg([new Move(\"R\", 1)]), new Alg([new Move(\"U\", 1)])),\n ]),\n new Alg([new Move(\"D\", 1)]),\n ),\n new Move(\"x\", 1),\n ]),\n\n FURURFCompact: new Alg([\n new Conjugate(\n new Alg([new Move(\"F\", 1)]),\n new Alg([\n new Commutator(\n new Alg([new Move(\"U\", 1)]),\n new Alg([new Move(\"R\", 1)]),\n ),\n ]),\n ),\n ]),\n\n APermCompact: new Alg([\n new Conjugate(\n new Alg([new Move(\"R\", 2)]),\n new Alg([\n new Commutator(\n new Alg([new Move(\"F\", 2)]),\n new Alg([new Move(\"R\", -1), new Move(\"B\", -1), new Move(\"R\", 1)]),\n ),\n ]),\n ),\n ]),\n\n FURURFMoves: new Alg([\n new Move(\"F\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", 1),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n new Move(\"F\", -1),\n ]),\n\n TPerm: new Alg([\n new Move(\"R\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n new Move(\"F\", 1),\n new Move(\"R\", 2),\n new Move(\"U\", -1),\n new Move(\"R\", -1),\n new Move(\"U\", -1),\n new Move(\"R\", 1),\n new Move(\"U\", 1),\n new Move(\"R\", -1),\n new Move(\"F\", -1),\n ]),\n\n HeadlightSwaps: new Alg([\n new Conjugate(\n new Alg([new Move(\"F\", 1)]),\n new Alg([\n new Grouping(\n new Alg([\n new Commutator(\n new Alg([new Move(\"R\", 1)]),\n new Alg([new Move(\"U\", 1)]),\n ),\n ]),\n 3,\n ),\n ]),\n ),\n ]),\n\n TriplePause: new Alg([new Pause(), new Pause(), new Pause()]),\n // AllAlgParts: [\n // new Alg([new Move(\"R\", 1), new Move(\"U\", -1)]),\n // new Grouping(new Alg([new Move(\"F\", 1)]), 2),\n // // new Rotation(\"y\", -1),\n // new Move(\"R\", 2),\n // new Commutator(new Alg([new Move(\"R\", 2)]), new Alg([new Move(\"U\", 2)]), 2),\n // new Conjugate(new Alg([new Move(\"L\", 2)]), new Alg([new Move(\"D\", -1)]), 2),\n // new Pause(),\n // new Newline(),\n // new LineComment(\"line comment\"),\n // ],\n};\n", "import type { KeyMapping } from \"cubing/puzzles/PuzzleLoader\";\nimport type { AlgLeaf } from \"./alg-nodes/AlgNode\";\n\n// TODO: options about whether to ignore modifier keys (e.g. alt, ctrl).\n// TODO: Support different mappings.\n// TODO: Return BaseMove instead?\nexport function keyToMove(\n keyMapping: KeyMapping | undefined,\n e: KeyboardEvent,\n): AlgLeaf | null {\n if (e.altKey || e.ctrlKey) {\n return null;\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code\n // > The KeyboardEvent.code property represents a physical key on the keyboard\n // > (as opposed to the character generated by pressing the key). In other\n // > words, this property returns a value that isn't altered by keyboard\n // > layout or the state of the modifier keys.\n const layoutIndepdendentCode = e.code;\n return keyMapping?.[layoutIndepdendentCode] ?? null;\n}\n", "import type { Alg } from \"./Alg\";\n\n// This is not the most sophisticated scheme, but it has been used in production\n// at alg.cubing.net for years.\nfunction serializeURLParam(a: Alg): string {\n let escaped = a.toString();\n escaped = escaped.replace(/_/g, \"_\").replace(/ /g, \"_\");\n escaped = escaped.replace(/\\+/g, \"b;\");\n escaped = escaped.replace(/-/g, \"-\").replace(/'/g, \"-\");\n return escaped;\n}\n\nexport interface AlgCubingNetOptions {\n alg?: Alg;\n setup?: Alg;\n title?: string;\n puzzle?:\n | \"1x1x1\"\n | \"2x2x2\"\n | \"3x3x3\"\n | \"4x4x4\"\n | \"5x5x5\"\n | \"6x6x6\"\n | \"7x7x7\"\n | \"8x8x8\"\n | \"9x9x9\"\n | \"10x10x10\"\n | \"11x11x11\"\n | \"12x12x12\"\n | \"13x13x13\"\n | \"14x14x14\"\n | \"16x16x16\"\n | \"17x17x17\";\n stage?:\n | \"full\"\n | \"cross\"\n | \"F2L\"\n | \"LL\"\n | \"OLL\"\n | \"PLL\"\n | \"CLS\"\n | \"ELS\"\n | \"L6E\"\n | \"CMLL\"\n | \"WV\"\n | \"ZBLL\"\n | \"void\";\n view?: \"editor\" | \"playback\" | \"fullscreen\";\n type?: \"moves\" | \"reconstruction\" | \"alg\" | \"reconstruction-end-with-setup\";\n}\n\n// TODO: runtime validation?\n/** @deprecated */\nexport function experimentalAlgCubingNetLink(\n options: AlgCubingNetOptions,\n): string {\n const url = new URL(\"https://alg.cubing.net\");\n if (!options.alg) {\n throw new Error(\"An alg parameter is required.\");\n }\n url.searchParams.set(\"alg\", serializeURLParam(options.alg));\n\n if (options.setup) {\n url.searchParams.set(\"setup\", serializeURLParam(options.setup));\n }\n if (options.title) {\n url.searchParams.set(\"title\", options.title);\n }\n if (options.puzzle) {\n if (\n ![\n \"1x1x1\",\n \"2x2x2\",\n \"3x3x3\",\n \"4x4x4\",\n \"5x5x5\",\n \"6x6x6\",\n \"7x7x7\",\n \"8x8x8\",\n \"9x9x9\",\n \"10x10x10\",\n \"11x11x11\",\n \"12x12x12\",\n \"13x13x13\",\n \"14x14x14\",\n \"16x16x16\",\n \"17x17x17\",\n ].includes(options.puzzle)\n ) {\n throw new Error(`Invalid puzzle parameter: ${options.puzzle}`);\n }\n url.searchParams.set(\"puzzle\", options.puzzle);\n }\n if (options.stage) {\n if (\n ![\n \"full\",\n \"cross\",\n \"F2L\",\n \"LL\",\n \"OLL\",\n \"PLL\",\n \"CLS\",\n \"ELS\",\n \"L6E\",\n \"CMLL\",\n \"WV\",\n \"ZBLL\",\n \"void\",\n ].includes(options.stage)\n ) {\n throw new Error(`Invalid stage parameter: ${options.stage}`);\n }\n url.searchParams.set(\"stage\", options.stage);\n }\n if (options.view) {\n if (![\"editor\", \"playback\", \"fullscreen\"].includes(options.view)) {\n throw new Error(`Invalid view parameter: ${options.view}`);\n }\n url.searchParams.set(\"view\", options.view);\n }\n if (options.type) {\n if (\n ![\n \"moves\",\n \"reconstruction\",\n \"alg\",\n \"reconstruction-end-with-setup\",\n ].includes(options.type)\n ) {\n throw new Error(`Invalid type parameter: ${options.type}`);\n }\n url.searchParams.set(\"type\", options.type);\n }\n return url.toString();\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/notation/CountAnimatedLeaves.ts", "../../../../src/cubing/notation/commonMetrics.ts", "../../../../src/cubing/notation/cube3x3x3Metrics.ts", "../../../../src/cubing/notation/CountMoves.ts"],
|
|
4
|
-
"sourcesContent": ["import type { LeafCount } from \"cubing/twisty/controllers/indexer/AlgIndexer\";\nimport {\n type Alg,\n type Commutator,\n type Conjugate,\n functionFromTraversal,\n type Grouping,\n type LineComment,\n type Move,\n type Newline,\n type Pause,\n TraversalUp,\n} from \"../alg\";\n\n// TODO: Include Pause, include amounts\nclass CountAnimatedLeaves extends TraversalUp<LeafCount, LeafCount> {\n public traverseAlg(alg: Alg): LeafCount {\n let total = 0 as LeafCount;\n for (const part of alg.childAlgNodes()) {\n /** @ts-expect-error: ts(2322) Rewriting this would required duplicating `total`. */\n total += this.traverseAlgNode(part);\n }\n return total;\n }\n\n public traverseGrouping(grouping: Grouping): LeafCount {\n return (this.traverseAlg(grouping.alg) *\n Math.abs(grouping.amount)) as LeafCount;\n }\n\n public traverseMove(_move: Move): LeafCount {\n return 1 as LeafCount;\n }\n\n public traverseCommutator(commutator: Commutator): LeafCount {\n return (2 *\n (this.traverseAlg(commutator.A) +\n this.traverseAlg(commutator.B))) as LeafCount;\n }\n\n public traverseConjugate(conjugate: Conjugate): LeafCount {\n return (2 * this.traverseAlg(conjugate.A) +\n this.traverseAlg(conjugate.B)) as LeafCount;\n }\n\n public traversePause(_pause: Pause): LeafCount {\n return 1 as LeafCount;\n }\n\n public traverseNewline(_newline: Newline): LeafCount {\n return 0 as LeafCount;\n }\n\n public traverseLineComment(_comment: LineComment): LeafCount {\n return 0 as LeafCount;\n }\n}\n\nexport const countAnimatedLeaves = functionFromTraversal(CountAnimatedLeaves);\n", "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 type Alg,\n type Commutator,\n type Conjugate,\n functionFromTraversal,\n type Grouping,\n type LineComment,\n type Move,\n type Newline,\n type Pause,\n TraversalUp,\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\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommonMetric", "CommonMetricAlias", "cache"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../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 nodeEndpoint from \"../node-adapter\";\n\nexport { wrap } from \"comlink\";\n\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 function searchWorkerURLImportMetaResolve(): 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 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}\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\ntype FallbackStrategyInfo = [\n fn: () => Promise<InsideOutsideAPI>,\n description: string,\n warnOnSuccess: null | string,\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 importMetaResolveStrategy: FallbackStrategyInfo = [\n async () => instantiateModuleWorker(searchWorkerURLImportMetaResolve()),\n \"using `import.meta.resolve(\u2026)\",\n null,\n ];\n const esbuildWorkaroundStrategy: FallbackStrategyInfo = [\n async () =>\n instantiateModuleWorker(await searchWorkerURLEsbuildWorkaround()),\n \"using the `esbuild` workaround\",\n // TODO: we will hopefully discontinue the `esbuild` workaround at some\n // point, but `esbuild` has been stuck for 3 years on this issue. Because\n // `esbuild` and Vite (which uses `esbuild`) are now dominating the\n // ecosystem, this just causes a warning for a lot of devs/users that they\n // can't do anything about. As frustrating as the situation is, the\n // workaround is semantically fine (even if it's convoluted) and is\n // preserved by `esbuild`-based flows in practice. So we suppress the\n // warning in the medium-term but maintain long-term hope that we can\n // remove it (and the other fallbacks as well).\n null,\n ];\n const newURLStrategy: FallbackStrategyInfo = [\n async () => instantiateModuleWorker(searchWorkerURLNewURLImportMetaURL()),\n \"using `new URL(\u2026, import.meta.url)`\",\n \"will\",\n ];\n const inlineNewURLStrategy: FallbackStrategyInfo = [\n instantiateModuleWorkerDirectlyForBrowser,\n \"using inline `new URL(\u2026, import.meta.url)`\",\n \"may\",\n ];\n\n const fallbackOrder: FallbackStrategyInfo[] =\n searchOutsideDebugGlobals.prioritizeEsbuildWorkaroundForWorkerInstantiation\n ? [\n esbuildWorkaroundStrategy,\n importMetaResolveStrategy,\n newURLStrategy,\n inlineNewURLStrategy,\n ]\n : [\n importMetaResolveStrategy,\n esbuildWorkaroundStrategy,\n newURLStrategy,\n inlineNewURLStrategy,\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 type { TwipsOptions } from \"./inside/solve/twips\";\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 const worker = searchOutsideDebugGlobals.forceNewWorkerForEveryScramble\n ? await instantiateWorker()\n : await getCachedWorkerInstance();\n const scrambleString =\n await worker.insideAPI.randomScrambleStringForEvent(eventID);\n return Alg.fromString(scrambleString);\n}\n\nexport async function deriveScrambleForEvent(\n derivationSeedHex: string,\n derivationSaltHierarchy: string[],\n eventID: string,\n): Promise<Alg> {\n if (!searchOutsideDebugGlobals.allowDerivedScrambles) {\n throw new Error(\"Derived scrambles are not allowed.\");\n }\n const worker = searchOutsideDebugGlobals.forceNewWorkerForEveryScramble\n ? await instantiateWorker()\n : await getCachedWorkerInstance();\n const scrambleString = await worker.insideAPI.deriveScrambleStringForEvent(\n derivationSeedHex,\n derivationSaltHierarchy,\n eventID,\n );\n return Alg.fromString(scrambleString);\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 SolveTwipsOptions {\n generatorMoves?: string[];\n targetPattern?: KPattern;\n minDepth?: number;\n maxDepth?: number;\n}\n\nexport async function solveTwips(\n kpuzzle: KPuzzle,\n pattern: KPattern,\n options?: SolveTwipsOptions,\n): Promise<Alg> {\n const { targetPattern, ...otherOptions } = options ?? {};\n const apiOptions: TwipsOptions = 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.solveTwipsToString(\n def,\n pattern.patternData,\n apiOptions,\n ),\n );\n } finally {\n console.log(\"Search ended, terminating dedicated `twips` 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 forceNewWorkerForEveryScramble: boolean;\n showWorkerInstantiationWarnings: boolean;\n // This can prevent a request to `search-worker-entry.js` when it doesn't exist, if the library semantics have been mangled by `esbuild`.\n prioritizeEsbuildWorkaroundForWorkerInstantiation: boolean;\n allowDerivedScrambles: boolean;\n}\n\nexport const searchOutsideDebugGlobals: SearchOutsideDebugGlobals = {\n logPerf: true,\n scramblePrefetchLevel: \"auto\",\n forceNewWorkerForEveryScramble: false,\n showWorkerInstantiationWarnings: true,\n prioritizeEsbuildWorkaroundForWorkerInstantiation: false,\n allowDerivedScrambles: false,\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 for (const booleanField of [\n \"forceNewWorkerForEveryScramble\",\n \"showWorkerInstantiationWarnings\",\n \"prioritizeEsbuildWorkaroundForWorkerInstantiation\",\n \"allowDerivedScrambles\",\n ] as const) {\n if (booleanField in options) {\n searchOutsideDebugGlobals[booleanField] =\n options[booleanField] ?? searchOutsideDebugGlobals[booleanField];\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/cubing/vendor/apache/comlink-everywhere/node-adapter.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n MessagePort as NodeMessagePort,\n Worker as NodeWorker,\n} from \"node:worker_threads\";\n\n/**\n * Copyright 2019 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ntype EventHandler = EventListenerObject | ((event: any) => void);\n\nfunction nodeEndpoint(parentPort: NodeMessagePort | NodeWorker): Worker & {\n nodeWorker?: import(\"node:worker_threads\").Worker;\n} {\n const listeners = new WeakMap();\n const parentPortAsNodeWorker = parentPort as NodeWorker;\n const constructedWorker = {\n postMessage: parentPort.postMessage.bind(parentPort),\n addEventListener: (_: string, eh: EventHandler) => {\n const l = (data: Event) => {\n if (\"handleEvent\" in eh) {\n eh.handleEvent({ data } as any);\n } else {\n eh({ data });\n }\n };\n parentPort.on(\"message\", l);\n listeners.set(eh, l);\n },\n removeEventListener: (_: string, eh: EventHandler) => {\n const l = listeners.get(eh);\n if (!l) {\n return;\n }\n parentPort.off(\"message\", l);\n listeners.delete(eh);\n },\n nodeWorker: parentPortAsNodeWorker,\n terminate: () => {\n parentPortAsNodeWorker.terminate();\n },\n // start: nep.start && nep.start.bind(nep),\n } as Worker & {\n nodeWorker?: import(\"worker_threads\").Worker;\n };\n\n /** Unref the parent port to prevent `node` from hanging:\n *\n * - https://github.com/cubing/cubing.js/issues/358\n * - https://github.com/nodejs/node/issues/53036#issuecomment-2118106710\n */\n parentPortAsNodeWorker.unref();\n\n return constructedWorker;\n}\n\nexport default nodeEndpoint;\n//# sourceMappingURL=node-adapter.mjs.map\n"],
|
|
5
|
-
"mappings": ";AAoBA,SAAS,aAAa,YAEpB;AACA,QAAM,YAAY,oBAAI,QAAQ;AAC9B,QAAM,yBAAyB;AAC/B,QAAM,oBAAoB;AAAA,IACxB,aAAa,WAAW,YAAY,KAAK,UAAU;AAAA,IACnD,kBAAkB,CAAC,GAAW,OAAqB;AACjD,YAAM,IAAI,CAAC,SAAgB;AACzB,YAAI,iBAAiB,IAAI;AACvB,aAAG,YAAY,EAAE,KAAK,CAAQ;AAAA,QAChC,OAAO;AACL,aAAG,EAAE,KAAK,CAAC;AAAA,QACb;AAAA,MACF;AACA,iBAAW,GAAG,WAAW,CAAC;AAC1B,gBAAU,IAAI,IAAI,CAAC;AAAA,IACrB;AAAA,IACA,qBAAqB,CAAC,GAAW,OAAqB;AACpD,YAAM,IAAI,UAAU,IAAI,EAAE;AAC1B,UAAI,CAAC,GAAG;AACN;AAAA,MACF;AACA,iBAAW,IAAI,WAAW,CAAC;AAC3B,gBAAU,OAAO,EAAE;AAAA,IACrB;AAAA,IACA,YAAY;AAAA,IACZ,WAAW,MAAM;AACf,6BAAuB,UAAU;AAAA,IACnC;AAAA;AAAA,EAEF;AASA,yBAAuB,MAAM;AAE7B,SAAO;AACT;AAEA,IAAO,uBAAQ;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|