docs: public static NodeSequence merging( final NodeSequence first,
                                          final NodeSequence second,
                                          final int totalWidth ) {
          if (first == null) {
              if (second == null) return emptySequence(totalWidth);
              final int firstWidth = totalWidth - second.width();
              return new NodeSequence() {
                  @Override
                  public int width() {
                      return totalWidth;
                  }
  
                  @Override
                  public long getRowCount() {
                      return second.getRowCount();
                  }
  
                  @Override
                  public boolean isEmpty() {
                      return second.isEmpty();
                  }
  
                  @Override
                  public Batch nextBatch() {
                      return batchOf(null, second.nextBatch(), firstWidth, second.width());
                  }
  
                  @Override
                  public void close() {
                      second.close();
                  }
  
                  @Override
                  public String toString() {
                      return "(merge width=" + width() + " (null-sequence)," + second + " )";
                  }
              };
          }
          if (second == null) {
              final int secondWidth = totalWidth - first.width();
              return new NodeSequence() {
                  @Override
                  public int width() {
                      return totalWidth;
                  }
  
                  @Override
                  public long getRowCount() {
                      return first.getRowCount();
                  }
  
                  @Override
                  public boolean isEmpty() {
                      return first.isEmpty();
                  }
  
                  @Override
                  public Batch nextBatch() {
                      return batchOf(first.nextBatch(), null, first.width(), secondWidth);
                  }
  
                  @Override
                  public void close() {
                      first.close();
                  }
  
                  @Override
                  public String toString() {
                      return "(merge width=" + width() + " " + first + ",(null-sequence) )";
                  }
              };
          }
          final int firstWidth = first.width();
          final int secondWidth = second.width();
          final long rowCount = Math.max(-1, first.getRowCount() + second.getRowCount());
          return new NodeSequence() {
              @Override
              public int width() {
                  return totalWidth;
              }
  
              @Override
              public long getRowCount() {
                  return rowCount;
              }
  
              @Override
              public boolean isEmpty() {
                  return rowCount == 0;
              }
  
              @Override
              public Batch nextBatch() {
                  Batch nextA = first.nextBatch();
                  Batch nextB = second.nextBatch();
                  if (nextA == null) {
                      if (nextB == null) return null;
                      return batchOf(null, nextB, firstWidth, secondWidth);
                  }
                  return batchOf(nextA, nextB, firstWidth, secondWidth);
              }
  
              @Override
              public void close() {
                  // always do both ...
                  try {
                      first.close();
                  } finally {
                      second.close();
                  }
              }
  
              @Override
              public String toString() {
                  return "(merge width=" + width() + " " + first + "," + second + " )";
              }
          };
      }