inverse method

Cube inverse()

Implementation

Cube inverse() {
  final cpA = List.of(_cp);
  final cpB = List.filled(Corner.count, Corner.upRightFront);
  final coA = List.of(_co);
  final coB = List.filled(Corner.count, 0);
  final epA = List.of(_ep);
  final epB = List.filled(Edge.count, Edge.upRight);
  final eoA = List.of(_eo);
  final eoB = List.filled(Edge.count, 0);

  for (var edge = 0; edge < Edge.count; edge++) {
    epB[epA[edge].index] = Edge.values[edge];
  }

  for (var edge = 0; edge < Edge.count; edge++) {
    eoB[edge] = eoA[epB[edge].index];
  }

  for (var corner = 0; corner < Corner.count; corner++) {
    cpB[cpA[corner].index] = Corner.values[corner];
  }

  for (var corner = 0; corner < Corner.count; corner++) {
    final ori = coA[cpB[corner].index];
    // Just for completeness. We do not invert mirrored.
    if (ori >= 3) {
      // cubes in the program.
      coB[corner] = ori;
    }
    // the standard case.
    else {
      coB[corner] = -ori;

      if (coB[corner] < 0) {
        coB[corner] += 3;
      }
    }
  }

  return Cube._(cp: cpB, co: coB, ep: epB, eo: eoB);
}