docs: public List<TextChunk> squeeze(Character c, int minRunLength) {
          Character currentChar, lastChar = null;
          int subSequenceLength = 0, subSequenceStart = 0;
          TextChunk[] t;
          List<TextChunk> rv = new ArrayList<>();
  
          for (int i = 0; i < this.getTextElements().size(); i++) {
              TextElement textElement = this.getTextElements().get(i);
              String text = textElement.getText();
              if (text.length() > 1) {
                  currentChar = text.trim().charAt(0);
              } else {
                  currentChar = text.charAt(0);
              }
  
  
              if (lastChar != null && currentChar.equals(c) && lastChar.equals(currentChar)) {
                  subSequenceLength++;
              } else {
                  if (((lastChar != null && !lastChar.equals(currentChar)) || i + 1 == this.getTextElements().size()) && subSequenceLength >= minRunLength) {
  
                      if (subSequenceStart == 0 && subSequenceLength <= this.getTextElements().size() - 1) {
                          t = this.splitAt(subSequenceLength);
                      } else {
                          t = this.splitAt(subSequenceStart);
                          rv.add(t[0]);
                      }
                      rv.addAll(t[1].squeeze(c, minRunLength)); // Lo and behold, recursion.
                      break;
  
                  }
                  subSequenceLength = 1;
                  subSequenceStart = i;
              }
              lastChar = currentChar;
          }
  
  
          if (rv.isEmpty()) { // no splits occurred, hence this.squeeze() == [this]
              if (subSequenceLength >= minRunLength && subSequenceLength < this.textElements.size()) {
                  TextChunk[] chunks = this.splitAt(subSequenceStart);
                  rv.add(chunks[0]);
              } else {
                  rv.add(this);
              }
          }
  
          return rv;
  
      }