docs: @Override
      public CrossoverResult crossover() {
          double[][] parents = parentSelection.selectParents();
  
          boolean isModified = false;
          double[] resultGenes = parents[0];
  
          if (rng.nextDouble() < crossoverRate) {
              // Select crossover points
              Deque<Integer> crossoverPoints = getCrossoverPointsGenerator(parents[0].length).getCrossoverPoints();
  
              // Crossover
              resultGenes = new double[parents[0].length];
              int currentParent = 0;
              int nextCrossover = crossoverPoints.pop();
              for (int i = 0; i < resultGenes.length; ++i) {
                  if (i == nextCrossover) {
                      currentParent = currentParent == 0 ? 1 : 0;
                      nextCrossover = crossoverPoints.pop();
                  }
                  resultGenes[i] = parents[currentParent][i];
              }
              isModified = true;
          }
  
          return new CrossoverResult(isModified, resultGenes);
      }