cubing 0.29.1 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +1 -6
  2. package/dist/esm/.DS_Store +0 -0
  3. package/dist/esm/alg/index.js +1 -2
  4. package/dist/esm/bluetooth/index.js +36 -32
  5. package/dist/esm/bluetooth/index.js.map +2 -2
  6. package/dist/esm/{chunk-XRZBPKES.js → chunk-35OK6TQ4.js} +328 -66
  7. package/dist/esm/chunk-35OK6TQ4.js.map +7 -0
  8. package/dist/esm/{chunk-WYKXX2XY.js → chunk-4QZRHN6S.js} +10 -8
  9. package/dist/esm/{chunk-WYKXX2XY.js.map → chunk-4QZRHN6S.js.map} +2 -2
  10. package/dist/esm/{chunk-2JDBIQSV.js → chunk-5OQ34D3X.js} +7 -7
  11. package/dist/esm/{chunk-2JDBIQSV.js.map → chunk-5OQ34D3X.js.map} +2 -2
  12. package/dist/esm/{chunk-U2ONHTIX.js → chunk-6FB2XWAK.js} +33 -31
  13. package/dist/esm/chunk-6FB2XWAK.js.map +7 -0
  14. package/dist/esm/{chunk-ZNAYJGVL.js → chunk-C6KMV2PL.js} +2 -2
  15. package/dist/esm/{chunk-ZNAYJGVL.js.map → chunk-C6KMV2PL.js.map} +0 -0
  16. package/dist/esm/{chunk-XU5ILFX5.js → chunk-GQBRF4EM.js} +6 -4
  17. package/dist/esm/{chunk-XU5ILFX5.js.map → chunk-GQBRF4EM.js.map} +2 -2
  18. package/dist/esm/{chunk-WXCNEGW3.js → chunk-HR5D6SD4.js} +2 -2
  19. package/dist/esm/{chunk-WXCNEGW3.js.map → chunk-HR5D6SD4.js.map} +2 -2
  20. package/dist/esm/{chunk-XT3R2ENM.js → chunk-KOAJIBEX.js} +47 -38
  21. package/dist/esm/chunk-KOAJIBEX.js.map +7 -0
  22. package/dist/esm/{chunk-OX6O2ZO5.js → chunk-QHWK5RXN.js} +1 -1
  23. package/dist/esm/chunk-QHWK5RXN.js.map +7 -0
  24. package/dist/esm/{chunk-GW4FGG42.js → chunk-RI2DAEY6.js} +2 -2
  25. package/dist/esm/{chunk-GW4FGG42.js.map → chunk-RI2DAEY6.js.map} +0 -0
  26. package/dist/esm/{chunk-AHEXXC6V.js → chunk-VIUWS2PX.js} +4 -4
  27. package/dist/esm/chunk-VIUWS2PX.js.map +7 -0
  28. package/dist/esm/{chunk-2IZUSAXQ.js → chunk-WEYPAZEE.js} +1 -1
  29. package/dist/esm/{chunk-2IZUSAXQ.js.map → chunk-WEYPAZEE.js.map} +1 -1
  30. package/dist/esm/{chunk-NI7U4XAZ.js → chunk-ZQT3QSWD.js} +226 -113
  31. package/dist/esm/chunk-ZQT3QSWD.js.map +7 -0
  32. package/dist/esm/kpuzzle/index.js +2 -3
  33. package/dist/esm/notation/index.js +2 -3
  34. package/dist/esm/protocol/index.js +4 -5
  35. package/dist/esm/puzzle-geometry/index.js +110 -85
  36. package/dist/esm/puzzle-geometry/index.js.map +2 -2
  37. package/dist/esm/puzzles/index.js +10 -7
  38. package/dist/esm/{puzzles-dynamic-3x3x3-KIG5A6QR.js → puzzles-dynamic-3x3x3-ZKMODX2P.js} +1 -3
  39. package/dist/esm/{puzzles-dynamic-3x3x3-KIG5A6QR.js.map → puzzles-dynamic-3x3x3-ZKMODX2P.js.map} +1 -1
  40. package/dist/esm/{puzzles-dynamic-4x4x4-PEDAPUZK.js → puzzles-dynamic-4x4x4-DT42HVIY.js} +1 -3
  41. package/dist/esm/{puzzles-dynamic-4x4x4-PEDAPUZK.js.map → puzzles-dynamic-4x4x4-DT42HVIY.js.map} +1 -1
  42. package/dist/esm/{puzzles-dynamic-side-events-5C7LMBWX.js → puzzles-dynamic-side-events-HMUBMHA5.js} +2 -4
  43. package/dist/esm/{puzzles-dynamic-side-events-5C7LMBWX.js.map → puzzles-dynamic-side-events-HMUBMHA5.js.map} +2 -2
  44. package/dist/esm/{puzzles-dynamic-unofficial-WWJ4NJMX.js → puzzles-dynamic-unofficial-QXSDLTK5.js} +1 -3
  45. package/dist/esm/{puzzles-dynamic-unofficial-WWJ4NJMX.js.map → puzzles-dynamic-unofficial-QXSDLTK5.js.map} +1 -1
  46. package/dist/esm/scramble/index.js +3 -4
  47. package/dist/esm/search/index.js +8 -9
  48. package/dist/esm/{search-dynamic-sgs-side-events-4H3X5HLH.js → search-dynamic-sgs-side-events-XNTCWRI4.js} +6 -7
  49. package/dist/esm/search-dynamic-sgs-side-events-XNTCWRI4.js.map +7 -0
  50. package/dist/esm/{search-dynamic-sgs-unofficial-7IRW4LVD.js → search-dynamic-sgs-unofficial-5KMZ747E.js} +122 -68
  51. package/dist/esm/search-dynamic-sgs-unofficial-5KMZ747E.js.map +7 -0
  52. package/dist/esm/{search-dynamic-solve-3x3x3-7XZTYQMO.js → search-dynamic-solve-3x3x3-TSXPWENP.js} +649 -407
  53. package/dist/esm/search-dynamic-solve-3x3x3-TSXPWENP.js.map +7 -0
  54. package/dist/esm/{search-dynamic-solve-4x4x4-7JTJCCSY.js → search-dynamic-solve-4x4x4-FKQ2JWK2.js} +399 -151
  55. package/dist/esm/search-dynamic-solve-4x4x4-FKQ2JWK2.js.map +7 -0
  56. package/dist/esm/{search-dynamic-solve-fto-4LI23P6K.js → search-dynamic-solve-fto-GPLW7S5F.js} +74 -35
  57. package/dist/esm/search-dynamic-solve-fto-GPLW7S5F.js.map +7 -0
  58. package/dist/esm/{search-dynamic-solve-kilominx-3HEVQ4MC.js → search-dynamic-solve-kilominx-HB2QFUGF.js} +136 -72
  59. package/dist/esm/search-dynamic-solve-kilominx-HB2QFUGF.js.map +7 -0
  60. package/dist/esm/{search-dynamic-solve-master_tetraminx-UB32C7MM.js → search-dynamic-solve-master_tetraminx-LR3LJI7O.js} +84 -42
  61. package/dist/esm/search-dynamic-solve-master_tetraminx-LR3LJI7O.js.map +7 -0
  62. package/dist/esm/{search-dynamic-solve-sq1-HA72TYF2.js → search-dynamic-solve-sq1-W33UXTDZ.js} +129 -55
  63. package/dist/esm/search-dynamic-solve-sq1-W33UXTDZ.js.map +7 -0
  64. package/dist/esm/search-worker-inside-generated-string-5HKZNHKK.js +3884 -0
  65. package/dist/esm/search-worker-inside-generated-string-5HKZNHKK.js.map +7 -0
  66. package/dist/esm/{search-worker-js-entry-T6YIT7YD.js → search-worker-js-entry-PDXEE46R.js} +44 -36
  67. package/dist/esm/search-worker-js-entry-PDXEE46R.js.map +7 -0
  68. package/dist/esm/{search-worker-ts-entry-OUEC4L5I.js → search-worker-ts-entry-UV2RY2EY.js} +3 -4
  69. package/dist/esm/{search-worker-ts-entry-OUEC4L5I.js.map → search-worker-ts-entry-UV2RY2EY.js.map} +1 -1
  70. package/dist/esm/stream/index.js +1 -2
  71. package/dist/esm/stream/index.js.map +2 -2
  72. package/dist/esm/twisty/index.js +368 -300
  73. package/dist/esm/twisty/index.js.map +3 -3
  74. package/dist/esm/{twisty-dynamic-3d-AZUSXQ5S.js → twisty-dynamic-3d-GPF6TW32.js} +57 -60
  75. package/dist/esm/twisty-dynamic-3d-GPF6TW32.js.map +7 -0
  76. package/dist/types/{Alg-137fb0d5.d.ts → Alg-1c8c3757.d.ts} +25 -26
  77. package/dist/types/{KState-a73111d7.d.ts → KState-7c9e40f4.d.ts} +1 -1
  78. package/dist/types/{TwizzleLink-bef52ecd.d.ts → TwizzleLink-3f8a01d2.d.ts} +19 -18
  79. package/dist/types/alg/index.d.ts +30 -8
  80. package/dist/types/bluetooth/index.d.ts +4 -4
  81. package/dist/types/{bluetooth-puzzle-8a678993.d.ts → bluetooth-puzzle-a64e9756.d.ts} +2 -2
  82. package/dist/types/kpuzzle/index.d.ts +2 -2
  83. package/dist/types/notation/index.d.ts +1 -1
  84. package/dist/types/{outside-e55f28a0.d.ts → outside-b62aa614.d.ts} +2 -2
  85. package/dist/types/{parseAlg-a28f7568.d.ts → parseAlg-d5fbee87.d.ts} +1 -1
  86. package/dist/types/protocol/index.d.ts +2 -2
  87. package/dist/types/puzzle-geometry/index.d.ts +3 -3
  88. package/dist/types/puzzles/index.d.ts +8 -6
  89. package/dist/types/scramble/index.d.ts +3 -3
  90. package/dist/types/search/index.d.ts +3 -3
  91. package/dist/types/stream/index.d.ts +3 -3
  92. package/dist/types/twisty/index.d.ts +5 -5
  93. package/package.json +51 -147
  94. package/dist/esm/chunk-AHEXXC6V.js.map +0 -7
  95. package/dist/esm/chunk-NI7U4XAZ.js.map +0 -7
  96. package/dist/esm/chunk-OX6O2ZO5.js.map +0 -7
  97. package/dist/esm/chunk-SBZRVSPK.js +0 -30
  98. package/dist/esm/chunk-SBZRVSPK.js.map +0 -7
  99. package/dist/esm/chunk-U2ONHTIX.js.map +0 -7
  100. package/dist/esm/chunk-XRZBPKES.js.map +0 -7
  101. package/dist/esm/chunk-XT3R2ENM.js.map +0 -7
  102. package/dist/esm/search-dynamic-sgs-side-events-4H3X5HLH.js.map +0 -7
  103. package/dist/esm/search-dynamic-sgs-unofficial-7IRW4LVD.js.map +0 -7
  104. package/dist/esm/search-dynamic-solve-3x3x3-7XZTYQMO.js.map +0 -7
  105. package/dist/esm/search-dynamic-solve-4x4x4-7JTJCCSY.js.map +0 -7
  106. package/dist/esm/search-dynamic-solve-fto-4LI23P6K.js.map +0 -7
  107. package/dist/esm/search-dynamic-solve-kilominx-3HEVQ4MC.js.map +0 -7
  108. package/dist/esm/search-dynamic-solve-master_tetraminx-UB32C7MM.js.map +0 -7
  109. package/dist/esm/search-dynamic-solve-sq1-HA72TYF2.js.map +0 -7
  110. package/dist/esm/search-worker-inside-generated-string-ZEY77HTF.js +0 -3886
  111. package/dist/esm/search-worker-inside-generated-string-ZEY77HTF.js.map +0 -7
  112. package/dist/esm/search-worker-js-entry-T6YIT7YD.js.map +0 -7
  113. package/dist/esm/twisty-dynamic-3d-AZUSXQ5S.js.map +0 -7
@@ -1,10 +1,3 @@
1
- import {
2
- __privateAdd,
3
- __privateGet,
4
- __privateMethod,
5
- __privateSet
6
- } from "./chunk-SBZRVSPK.js";
7
-
8
1
  // src/cubing/alg/common.ts
9
2
  var writeAlgDebugField = false;
10
3
  var Comparable = class {
@@ -232,8 +225,7 @@ var LineComment = class extends AlgCommon {
232
225
  // src/cubing/alg/alg-nodes/leaves/Newline.ts
233
226
  var Newline = class extends AlgCommon {
234
227
  toString() {
235
- return `
236
- `;
228
+ return "\n";
237
229
  }
238
230
  isIdentical(other) {
239
231
  return other.is(Newline);
@@ -249,7 +241,7 @@ var Newline = class extends AlgCommon {
249
241
  // src/cubing/alg/alg-nodes/leaves/Pause.ts
250
242
  var Pause = class extends AlgCommon {
251
243
  toString() {
252
- return `.`;
244
+ return ".";
253
245
  }
254
246
  isIdentical(other) {
255
247
  return other.is(Pause);
@@ -431,20 +423,22 @@ var AlgParser = class {
431
423
  const B = this.parseAlgWithStopping(["]"]);
432
424
  this.mustConsumeNext("]");
433
425
  switch (separator) {
434
- case ":":
426
+ case ":": {
435
427
  algBuilder.push(
436
428
  addCharIndices(new Conjugate(A, B), savedCharIndex, this.#idx)
437
429
  );
438
430
  crowded = true;
439
431
  algEndIdx = this.#idx;
440
432
  continue mainLoop;
441
- case ",":
433
+ }
434
+ case ",": {
442
435
  algBuilder.push(
443
436
  addCharIndices(new Commutator(A, B), savedCharIndex, this.#idx)
444
437
  );
445
438
  crowded = true;
446
439
  algEndIdx = this.#idx;
447
440
  continue mainLoop;
441
+ }
448
442
  default:
449
443
  throw new Error("unexpected parsing error");
450
444
  }
@@ -733,7 +727,7 @@ var QuantumMove = class extends Comparable {
733
727
  if (this.#innerLayer !== null) {
734
728
  s = String(this.#innerLayer) + s;
735
729
  if (this.#outerLayer !== null) {
736
- s = String(this.#outerLayer) + "-" + s;
730
+ s = `${String(this.#outerLayer)}-${s}`;
737
731
  }
738
732
  }
739
733
  return s;
@@ -929,7 +923,7 @@ function dispatch(t, algNode, dataDown) {
929
923
  if (algNode.is(LineComment)) {
930
924
  return t.traverseLineComment(algNode, dataDown);
931
925
  }
932
- throw new Error(`unknown AlgNode`);
926
+ throw new Error("unknown AlgNode");
933
927
  }
934
928
  function mustBeAlgNode(t) {
935
929
  if (t.is(Grouping) || t.is(Move) || t.is(Commutator) || t.is(Conjugate) || t.is(Pause) || t.is(Newline) || t.is(LineComment)) {
@@ -957,59 +951,184 @@ var TraversalUp = class extends TraversalDownUp {
957
951
  return mustBeAlgNode(this.traverseAlgNode(algNode));
958
952
  }
959
953
  };
960
- var _newPlaceholderAssociationsMap, _newPlaceholderAssociations, newPlaceholderAssociations_fn, _newAmount, newAmount_fn;
961
- var _Simplify = class extends TraversalDownUp {
962
- constructor() {
963
- super(...arguments);
964
- __privateAdd(this, _newPlaceholderAssociations);
965
- __privateAdd(this, _newPlaceholderAssociationsMap, void 0);
954
+
955
+ // src/cubing/alg/simplify/options.ts
956
+ var DEFAULT_DIRECTIONAL = "any-direction";
957
+ var DEFAULT_MOD_WRAP = "canonical-centered";
958
+ var AppendOptionsHelper = class {
959
+ constructor(config = {}) {
960
+ this.config = config;
961
+ }
962
+ cancelQuantum() {
963
+ const { cancel } = this.config;
964
+ if (cancel === true) {
965
+ return DEFAULT_DIRECTIONAL;
966
+ }
967
+ if (cancel === false) {
968
+ return "none";
969
+ }
970
+ return cancel?.directional ?? "none";
966
971
  }
967
- *traverseAlg(alg, options) {
968
- if (options.depth === 0) {
969
- yield* alg.childAlgNodes();
970
- return;
972
+ cancelAny() {
973
+ return this.config.cancel && this.cancelQuantum() !== "none";
974
+ }
975
+ cancelPuzzleSpecificModWrap() {
976
+ const { cancel } = this.config;
977
+ if (cancel === true || cancel === false) {
978
+ return DEFAULT_MOD_WRAP;
971
979
  }
972
- const newAlgNodes = [];
973
- let lastAlgNode = null;
974
- const collapseMoves = options?.collapseMoves ?? true;
975
- function appendMoveWithNewAmount(move, deltaAmount) {
976
- var _a;
977
- const newAmount = __privateMethod(_a = _Simplify, _newAmount, newAmount_fn).call(_a, move, deltaAmount, options);
978
- if (newAmount === 0) {
979
- return false;
980
+ return cancel?.puzzleSpecificModWrap ?? DEFAULT_MOD_WRAP;
981
+ }
982
+ puzzleSpecificSimplifyOptions() {
983
+ return this.config.puzzleLoader?.puzzleSpecificSimplifyOptions ?? this.config.puzzleSpecificSimplifyOptions;
984
+ }
985
+ };
986
+
987
+ // src/cubing/alg/simplify/append.ts
988
+ function areSameDirection(direction, move2) {
989
+ return direction * Math.sign(move2.amount) >= 0;
990
+ }
991
+ function offsetMod(x, positiveMod, offset) {
992
+ return ((x - offset) % positiveMod + positiveMod) % positiveMod + offset;
993
+ }
994
+ function experimentalAppendMove(alg, addedMove, options) {
995
+ const optionsHelper = new AppendOptionsHelper(options);
996
+ let outputPrefix = Array.from(alg.childAlgNodes());
997
+ let outputSuffix = [addedMove];
998
+ function output() {
999
+ return new Alg([...outputPrefix, ...outputSuffix]);
1000
+ }
1001
+ function modMove(move) {
1002
+ if (optionsHelper.cancelPuzzleSpecificModWrap() === "none") {
1003
+ return move;
1004
+ }
1005
+ const quantumMoveOrder = optionsHelper.puzzleSpecificSimplifyOptions()?.quantumMoveOrder;
1006
+ if (!quantumMoveOrder) {
1007
+ return move;
1008
+ }
1009
+ const mod = quantumMoveOrder(addedMove.quantum);
1010
+ let offset;
1011
+ switch (optionsHelper.cancelPuzzleSpecificModWrap()) {
1012
+ case "gravity": {
1013
+ offset = -Math.floor((mod - (move.amount < 0 ? 0 : 1)) / 2);
1014
+ break;
1015
+ }
1016
+ case "canonical-centered": {
1017
+ offset = -Math.floor((mod - 1) / 2);
1018
+ break;
1019
+ }
1020
+ case "canonical-positive": {
1021
+ offset = 0;
1022
+ break;
1023
+ }
1024
+ case "preserve-sign": {
1025
+ offset = move.amount < 0 ? 1 - mod : 0;
1026
+ break;
1027
+ }
1028
+ default: {
1029
+ throw new Error("Unknown mod wrap");
980
1030
  }
981
- const newMove = new Move(move.quantum, newAmount);
982
- newAlgNodes.push(newMove);
983
- lastAlgNode = newMove;
984
- return true;
985
1031
  }
986
- function appendCollapsed(newAlgNode) {
987
- if (collapseMoves && lastAlgNode?.is(Move) && newAlgNode.is(Move) && lastAlgNode.quantum.isIdentical(newAlgNode.quantum)) {
988
- newAlgNodes.pop();
989
- if (!appendMoveWithNewAmount(
990
- lastAlgNode,
991
- newAlgNode.amount
992
- )) {
993
- lastAlgNode = newAlgNodes.slice(-1)[0];
994
- }
995
- } else {
996
- if (newAlgNode.is(Move)) {
997
- appendMoveWithNewAmount(newAlgNode, 0);
998
- } else {
999
- newAlgNodes.push(newAlgNode);
1000
- lastAlgNode = newAlgNode;
1032
+ let offsetAmount = offsetMod(move.amount, mod, offset);
1033
+ return move.modified({ amount: offsetAmount });
1034
+ }
1035
+ if (optionsHelper.cancelAny()) {
1036
+ let canCancelMoveBasedOnQuantum;
1037
+ const axis = optionsHelper.puzzleSpecificSimplifyOptions()?.axis;
1038
+ if (axis) {
1039
+ canCancelMoveBasedOnQuantum = (move) => axis.areQuantumMovesSameAxis(addedMove.quantum, move.quantum);
1040
+ } else {
1041
+ const newMoveQuantumString = addedMove.quantum.toString();
1042
+ canCancelMoveBasedOnQuantum = (move) => move.quantum.toString() === newMoveQuantumString;
1043
+ }
1044
+ const sameDirectionOnly = optionsHelper.cancelQuantum() === "same-direction";
1045
+ const quantumDirections = /* @__PURE__ */ new Map();
1046
+ quantumDirections.set(
1047
+ addedMove.quantum.toString(),
1048
+ Math.sign(addedMove.amount)
1049
+ );
1050
+ let i;
1051
+ for (i = outputPrefix.length - 1; i >= 0; i--) {
1052
+ const move = outputPrefix[i].as(Move);
1053
+ if (!move) {
1054
+ break;
1055
+ }
1056
+ if (!canCancelMoveBasedOnQuantum(move)) {
1057
+ break;
1058
+ }
1059
+ const quantumKey = move.quantum.toString();
1060
+ if (sameDirectionOnly) {
1061
+ const existingQuantumDirectionOnAxis = quantumDirections.get(quantumKey);
1062
+ if (existingQuantumDirectionOnAxis && !areSameDirection(existingQuantumDirectionOnAxis, move)) {
1063
+ break;
1001
1064
  }
1065
+ quantumDirections.set(quantumKey, Math.sign(move.amount));
1002
1066
  }
1003
1067
  }
1004
- const newOptions = {
1068
+ const suffix = [...outputPrefix.splice(i + 1), addedMove];
1069
+ if (axis) {
1070
+ outputSuffix = axis.simplifySameAxisMoves(
1071
+ suffix,
1072
+ optionsHelper.cancelPuzzleSpecificModWrap() !== "none"
1073
+ );
1074
+ } else {
1075
+ let amount = suffix.reduce(
1076
+ (sum, move) => sum + move.amount,
1077
+ 0
1078
+ );
1079
+ if (quantumDirections.size !== 1) {
1080
+ throw new Error(
1081
+ "Internal error: multiple quantums when one was expected"
1082
+ );
1083
+ }
1084
+ outputSuffix = [new Move(addedMove.quantum, amount)];
1085
+ }
1086
+ }
1087
+ outputSuffix = outputSuffix.map((m) => modMove(m)).filter(
1088
+ (move) => move.amount !== 0
1089
+ );
1090
+ return output();
1091
+ }
1092
+ function experimentalAppendNode(alg, leaf, options) {
1093
+ const maybeMove = leaf.as(Move);
1094
+ if (maybeMove) {
1095
+ return experimentalAppendMove(alg, maybeMove, options);
1096
+ } else {
1097
+ return new Alg([...alg.childAlgNodes(), leaf]);
1098
+ }
1099
+ }
1100
+
1101
+ // src/cubing/alg/simplify/simplify.ts
1102
+ var Simplify = class extends TraversalDownUp {
1103
+ #newPlaceholderAssociationsMap;
1104
+ #newPlaceholderAssociations() {
1105
+ return this.#newPlaceholderAssociationsMap ?? (this.#newPlaceholderAssociationsMap = /* @__PURE__ */ new Map());
1106
+ }
1107
+ #descendOptions(options) {
1108
+ return {
1109
+ ...options,
1005
1110
  depth: options.depth ? options.depth - 1 : null
1006
1111
  };
1112
+ }
1113
+ *traverseAlg(alg, options) {
1114
+ if (options.depth === 0) {
1115
+ yield* alg.childAlgNodes();
1116
+ return;
1117
+ }
1118
+ let output = [];
1119
+ const newOptions = this.#descendOptions(options);
1007
1120
  for (const algNode of alg.childAlgNodes()) {
1008
- for (const ancestorAlgNode of this.traverseAlgNode(algNode, newOptions)) {
1009
- appendCollapsed(ancestorAlgNode);
1121
+ for (const traversedNode of this.traverseAlgNode(algNode, newOptions)) {
1122
+ output = Array.from(
1123
+ experimentalAppendNode(
1124
+ new Alg(output),
1125
+ traversedNode,
1126
+ newOptions
1127
+ ).childAlgNodes()
1128
+ );
1010
1129
  }
1011
1130
  }
1012
- for (const newAlgNode of newAlgNodes) {
1131
+ for (const newAlgNode of output) {
1013
1132
  yield newAlgNode;
1014
1133
  }
1015
1134
  }
@@ -1018,14 +1137,17 @@ var _Simplify = class extends TraversalDownUp {
1018
1137
  yield grouping;
1019
1138
  return;
1020
1139
  }
1021
- const newOptions = {
1022
- depth: options.depth ? options.depth - 1 : null
1023
- };
1140
+ if (grouping.amount === 0) {
1141
+ return;
1142
+ }
1024
1143
  const newGrouping = new Grouping(
1025
- this.traverseAlg(grouping.alg, newOptions),
1144
+ this.traverseAlg(grouping.alg, this.#descendOptions(options)),
1026
1145
  grouping.amount
1027
1146
  );
1028
- const newPlaceholder = __privateMethod(this, _newPlaceholderAssociations, newPlaceholderAssociations_fn).call(this).get(grouping);
1147
+ if (newGrouping.alg.experimentalIsEmpty()) {
1148
+ return;
1149
+ }
1150
+ const newPlaceholder = this.#newPlaceholderAssociations().get(grouping);
1029
1151
  if (newPlaceholder) {
1030
1152
  newGrouping.experimentalNISSPlaceholder = newPlaceholder;
1031
1153
  newPlaceholder.experimentalNISSGrouping = newGrouping;
@@ -1035,36 +1157,64 @@ var _Simplify = class extends TraversalDownUp {
1035
1157
  *traverseMove(move, _options) {
1036
1158
  yield move;
1037
1159
  }
1160
+ #doChildrenCommute(A, B, options) {
1161
+ if (A.experimentalNumChildAlgNodes() === 1 && B.experimentalNumChildAlgNodes() === 1) {
1162
+ const aMove = Array.from(A.childAlgNodes())[0]?.as(Move);
1163
+ const bMove = Array.from(B.childAlgNodes())[0]?.as(Move);
1164
+ if (!(aMove && bMove)) {
1165
+ return false;
1166
+ }
1167
+ if (bMove.quantum.isIdentical(aMove.quantum)) {
1168
+ return true;
1169
+ }
1170
+ const appendOptionsHelper = new AppendOptionsHelper(options);
1171
+ if (appendOptionsHelper.puzzleSpecificSimplifyOptions()?.axis?.areQuantumMovesSameAxis(
1172
+ aMove.quantum,
1173
+ bMove.quantum
1174
+ )) {
1175
+ return true;
1176
+ }
1177
+ }
1178
+ return false;
1179
+ }
1038
1180
  *traverseCommutator(commutator, options) {
1039
1181
  if (options.depth === 0) {
1040
1182
  yield commutator;
1041
1183
  return;
1042
1184
  }
1043
- const newOptions = {
1044
- depth: options.depth ? options.depth - 1 : null
1045
- };
1046
- yield new Commutator(
1185
+ const newOptions = this.#descendOptions(options);
1186
+ const newCommutator = new Commutator(
1047
1187
  this.traverseAlg(commutator.A, newOptions),
1048
1188
  this.traverseAlg(commutator.B, newOptions)
1049
1189
  );
1190
+ if (newCommutator.A.experimentalIsEmpty() || newCommutator.B.experimentalIsEmpty() || newCommutator.A.isIdentical(newCommutator.B) || newCommutator.A.isIdentical(newCommutator.B.invert()) || this.#doChildrenCommute(newCommutator.A, newCommutator.B, options)) {
1191
+ return;
1192
+ }
1193
+ yield newCommutator;
1050
1194
  }
1051
1195
  *traverseConjugate(conjugate, options) {
1052
1196
  if (options.depth === 0) {
1053
1197
  yield conjugate;
1054
1198
  return;
1055
1199
  }
1056
- const newOptions = {
1057
- depth: options.depth ? options.depth - 1 : null
1058
- };
1059
- yield new Conjugate(
1200
+ const newOptions = this.#descendOptions(options);
1201
+ const newConjugate = new Conjugate(
1060
1202
  this.traverseAlg(conjugate.A, newOptions),
1061
1203
  this.traverseAlg(conjugate.B, newOptions)
1062
1204
  );
1205
+ if (newConjugate.B.experimentalIsEmpty()) {
1206
+ return;
1207
+ }
1208
+ if (newConjugate.A.experimentalIsEmpty() || newConjugate.A.isIdentical(newConjugate.B) || newConjugate.A.isIdentical(newConjugate.B.invert()) || this.#doChildrenCommute(newConjugate.A, newConjugate.B, options)) {
1209
+ yield* conjugate.B.childAlgNodes();
1210
+ return;
1211
+ }
1212
+ yield newConjugate;
1063
1213
  }
1064
1214
  *traversePause(pause, _options) {
1065
1215
  if (pause.experimentalNISSGrouping) {
1066
1216
  const newPause = new Pause();
1067
- __privateMethod(this, _newPlaceholderAssociations, newPlaceholderAssociations_fn).call(this).set(
1217
+ this.#newPlaceholderAssociations().set(
1068
1218
  pause.experimentalNISSGrouping,
1069
1219
  newPause
1070
1220
  );
@@ -1080,23 +1230,6 @@ var _Simplify = class extends TraversalDownUp {
1080
1230
  yield comment;
1081
1231
  }
1082
1232
  };
1083
- var Simplify = _Simplify;
1084
- _newPlaceholderAssociationsMap = new WeakMap();
1085
- _newPlaceholderAssociations = new WeakSet();
1086
- newPlaceholderAssociations_fn = function() {
1087
- return __privateGet(this, _newPlaceholderAssociationsMap) ?? __privateSet(this, _newPlaceholderAssociationsMap, /* @__PURE__ */ new Map());
1088
- };
1089
- _newAmount = new WeakSet();
1090
- newAmount_fn = function(move, deltaAmount, options) {
1091
- let newAmount = move.amount + deltaAmount;
1092
- if (options?.quantumMoveOrder) {
1093
- const order = options.quantumMoveOrder(move.quantum);
1094
- const min = Math.floor(order / 2) + 1 - order;
1095
- newAmount = (newAmount % order + order - min) % order + min;
1096
- }
1097
- return newAmount;
1098
- };
1099
- __privateAdd(Simplify, _newAmount);
1100
1233
  var simplifyInstance = new Simplify();
1101
1234
  var simplify = simplifyInstance.traverseAlg.bind(simplifyInstance);
1102
1235
 
@@ -1228,9 +1361,12 @@ var Alg = class extends AlgCommon {
1228
1361
  }
1229
1362
  return output;
1230
1363
  }
1231
- simplify(options) {
1364
+ experimentalSimplify(options) {
1232
1365
  return new Alg(simplify(this, options ?? {}));
1233
1366
  }
1367
+ simplify(options) {
1368
+ return this.experimentalSimplify(options);
1369
+ }
1234
1370
  };
1235
1371
  function spaceBetween(u1, u2) {
1236
1372
  if (u1.is(Newline) || u2.is(Newline)) {
@@ -1490,29 +1626,6 @@ function experimentalAlgCubingNetLink(options) {
1490
1626
  return url.toString();
1491
1627
  }
1492
1628
 
1493
- // src/cubing/alg/operation.ts
1494
- function experimentalAppendMove(alg, newMove, options) {
1495
- const oldAlgNodes = Array.from(alg.childAlgNodes());
1496
- const oldLastMove = oldAlgNodes[oldAlgNodes.length - 1];
1497
- if (options?.coalesce && oldLastMove && oldLastMove.quantum && oldLastMove.quantum.isIdentical(newMove.quantum)) {
1498
- const newAlgNodes = oldAlgNodes.slice(0, oldAlgNodes.length - 1);
1499
- let newAmount = oldLastMove.amount + newMove.amount;
1500
- const mod = options?.mod;
1501
- if (mod) {
1502
- newAmount = (newAmount % mod + mod) % mod;
1503
- if (newAmount * 2 > mod) {
1504
- newAmount -= mod;
1505
- }
1506
- }
1507
- if (newAmount !== 0) {
1508
- newAlgNodes.push(oldLastMove.modified({ amount: newAmount }));
1509
- }
1510
- return new Alg(newAlgNodes);
1511
- } else {
1512
- return new Alg([...oldAlgNodes, newMove]);
1513
- }
1514
- }
1515
-
1516
1629
  export {
1517
1630
  direct,
1518
1631
  directedGenerator,
@@ -1529,10 +1642,10 @@ export {
1529
1642
  experimentalIs,
1530
1643
  TraversalDownUp,
1531
1644
  TraversalUp,
1645
+ experimentalAppendMove,
1532
1646
  Alg,
1533
1647
  Example,
1534
1648
  keyToMove,
1535
- experimentalAlgCubingNetLink,
1536
- experimentalAppendMove
1649
+ experimentalAlgCubingNetLink
1537
1650
  };
1538
- //# sourceMappingURL=chunk-NI7U4XAZ.js.map
1651
+ //# sourceMappingURL=chunk-ZQT3QSWD.js.map