docs: public static void joinLinesWithFrame(TextGraphics graphics) {
          TerminalSize drawableArea = graphics.getSize();
          if(drawableArea.getRows() <= 2 || drawableArea.getColumns() <= 2) {
              //Too small
              return;
          }
  
          int upperRow = 0;
          int lowerRow = drawableArea.getRows() - 1;
          int leftRow = 0;
          int rightRow = drawableArea.getColumns() - 1;
  
          List<Character> junctionFromBelowSingle = Arrays.asList(
                  Symbols.SINGLE_LINE_VERTICAL,
                  Symbols.BOLD_FROM_NORMAL_SINGLE_LINE_VERTICAL,
                  Symbols.SINGLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_HORIZONTAL_SINGLE_LINE_CROSS,
                  Symbols.SINGLE_LINE_BOTTOM_LEFT_CORNER,
                  Symbols.SINGLE_LINE_BOTTOM_RIGHT_CORNER,
                  Symbols.SINGLE_LINE_T_LEFT,
                  Symbols.SINGLE_LINE_T_RIGHT,
                  Symbols.SINGLE_LINE_T_UP,
                  Symbols.SINGLE_LINE_T_DOUBLE_LEFT,
                  Symbols.SINGLE_LINE_T_DOUBLE_RIGHT,
                  Symbols.DOUBLE_LINE_T_SINGLE_UP);
          List<Character> junctionFromBelowDouble = Arrays.asList(
                  Symbols.DOUBLE_LINE_VERTICAL,
                  Symbols.DOUBLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_VERTICAL_SINGLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_BOTTOM_LEFT_CORNER,
                  Symbols.DOUBLE_LINE_BOTTOM_RIGHT_CORNER,
                  Symbols.DOUBLE_LINE_T_LEFT,
                  Symbols.DOUBLE_LINE_T_RIGHT,
                  Symbols.DOUBLE_LINE_T_UP,
                  Symbols.DOUBLE_LINE_T_SINGLE_LEFT,
                  Symbols.DOUBLE_LINE_T_SINGLE_RIGHT,
                  Symbols.SINGLE_LINE_T_DOUBLE_UP);
          List<Character> junctionFromAboveSingle = Arrays.asList(
                  Symbols.SINGLE_LINE_VERTICAL,
                  Symbols.BOLD_TO_NORMAL_SINGLE_LINE_VERTICAL,
                  Symbols.SINGLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_HORIZONTAL_SINGLE_LINE_CROSS,
                  Symbols.SINGLE_LINE_TOP_LEFT_CORNER,
                  Symbols.SINGLE_LINE_TOP_RIGHT_CORNER,
                  Symbols.SINGLE_LINE_T_LEFT,
                  Symbols.SINGLE_LINE_T_RIGHT,
                  Symbols.SINGLE_LINE_T_DOWN,
                  Symbols.SINGLE_LINE_T_DOUBLE_LEFT,
                  Symbols.SINGLE_LINE_T_DOUBLE_RIGHT,
                  Symbols.DOUBLE_LINE_T_SINGLE_DOWN);
          List<Character> junctionFromAboveDouble = Arrays.asList(
                  Symbols.DOUBLE_LINE_VERTICAL,
                  Symbols.DOUBLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_VERTICAL_SINGLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_TOP_LEFT_CORNER,
                  Symbols.DOUBLE_LINE_TOP_RIGHT_CORNER,
                  Symbols.DOUBLE_LINE_T_LEFT,
                  Symbols.DOUBLE_LINE_T_RIGHT,
                  Symbols.DOUBLE_LINE_T_DOWN,
                  Symbols.DOUBLE_LINE_T_SINGLE_LEFT,
                  Symbols.DOUBLE_LINE_T_SINGLE_RIGHT,
                  Symbols.SINGLE_LINE_T_DOUBLE_DOWN);
          List<Character> junctionFromLeftSingle = Arrays.asList(
                  Symbols.SINGLE_LINE_HORIZONTAL,
                  Symbols.BOLD_TO_NORMAL_SINGLE_LINE_HORIZONTAL,
                  Symbols.SINGLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_VERTICAL_SINGLE_LINE_CROSS,
                  Symbols.SINGLE_LINE_BOTTOM_LEFT_CORNER,
                  Symbols.SINGLE_LINE_TOP_LEFT_CORNER,
                  Symbols.SINGLE_LINE_T_UP,
                  Symbols.SINGLE_LINE_T_DOWN,
                  Symbols.SINGLE_LINE_T_RIGHT,
                  Symbols.SINGLE_LINE_T_DOUBLE_UP,
                  Symbols.SINGLE_LINE_T_DOUBLE_DOWN,
                  Symbols.DOUBLE_LINE_T_SINGLE_RIGHT);
          List<Character> junctionFromLeftDouble = Arrays.asList(
                  Symbols.DOUBLE_LINE_HORIZONTAL,
                  Symbols.DOUBLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_HORIZONTAL_SINGLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_BOTTOM_LEFT_CORNER,
                  Symbols.DOUBLE_LINE_TOP_LEFT_CORNER,
                  Symbols.DOUBLE_LINE_T_UP,
                  Symbols.DOUBLE_LINE_T_DOWN,
                  Symbols.DOUBLE_LINE_T_RIGHT,
                  Symbols.DOUBLE_LINE_T_SINGLE_UP,
                  Symbols.DOUBLE_LINE_T_SINGLE_DOWN,
                  Symbols.SINGLE_LINE_T_DOUBLE_RIGHT);
          List<Character> junctionFromRightSingle = Arrays.asList(
                  Symbols.SINGLE_LINE_HORIZONTAL,
                  Symbols.BOLD_FROM_NORMAL_SINGLE_LINE_HORIZONTAL,
                  Symbols.SINGLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_VERTICAL_SINGLE_LINE_CROSS,
                  Symbols.SINGLE_LINE_BOTTOM_RIGHT_CORNER,
                  Symbols.SINGLE_LINE_TOP_RIGHT_CORNER,
                  Symbols.SINGLE_LINE_T_UP,
                  Symbols.SINGLE_LINE_T_DOWN,
                  Symbols.SINGLE_LINE_T_LEFT,
                  Symbols.SINGLE_LINE_T_DOUBLE_UP,
                  Symbols.SINGLE_LINE_T_DOUBLE_DOWN,
                  Symbols.DOUBLE_LINE_T_SINGLE_LEFT);
          List<Character> junctionFromRightDouble = Arrays.asList(
                  Symbols.DOUBLE_LINE_HORIZONTAL,
                  Symbols.DOUBLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_HORIZONTAL_SINGLE_LINE_CROSS,
                  Symbols.DOUBLE_LINE_BOTTOM_RIGHT_CORNER,
                  Symbols.DOUBLE_LINE_TOP_RIGHT_CORNER,
                  Symbols.DOUBLE_LINE_T_UP,
                  Symbols.DOUBLE_LINE_T_DOWN,
                  Symbols.DOUBLE_LINE_T_LEFT,
                  Symbols.DOUBLE_LINE_T_SINGLE_UP,
                  Symbols.DOUBLE_LINE_T_SINGLE_DOWN,
                  Symbols.SINGLE_LINE_T_DOUBLE_LEFT);
  
          //Go horizontally and check vertical neighbours if it's possible to extend lines into the border
          for(int column = 1; column < drawableArea.getColumns() - 1; column++) {
              //Check first row
              TextCharacter borderCharacter = graphics.getCharacter(column, upperRow);
              if(borderCharacter == null) {
                  continue;
              }
              TextCharacter neighbourCharacter = graphics.getCharacter(column, upperRow + 1);
              if(neighbourCharacter != null) {
                  char neighbour = neighbourCharacter.getCharacter();
                  if(borderCharacter.getCharacter() == Symbols.SINGLE_LINE_HORIZONTAL) {
                      if(junctionFromBelowSingle.contains(neighbour)) {
                          graphics.setCharacter(column, upperRow, borderCharacter.withCharacter(Symbols.SINGLE_LINE_T_DOWN));
                      }
                      else if(junctionFromBelowDouble.contains(neighbour)) {
                          graphics.setCharacter(column, upperRow, borderCharacter.withCharacter(Symbols.SINGLE_LINE_T_DOUBLE_DOWN));
                      }
                  }
                  else if(borderCharacter.getCharacter() == Symbols.DOUBLE_LINE_HORIZONTAL) {
                      if(junctionFromBelowSingle.contains(neighbour)) {
                          graphics.setCharacter(column, upperRow, borderCharacter.withCharacter(Symbols.DOUBLE_LINE_T_SINGLE_DOWN));
                      }
                      else if(junctionFromBelowDouble.contains(neighbour)) {
                          graphics.setCharacter(column, upperRow, borderCharacter.withCharacter(Symbols.DOUBLE_LINE_T_DOWN));
                      }
                  }
              }
  
              //Check last row
              borderCharacter = graphics.getCharacter(column, lowerRow);
              if(borderCharacter == null) {
                  continue;
              }
              neighbourCharacter = graphics.getCharacter(column, lowerRow - 1);
              if(neighbourCharacter != null) {
                  char neighbour = neighbourCharacter.getCharacter();
                  if(borderCharacter.getCharacter() == Symbols.SINGLE_LINE_HORIZONTAL) {
                      if(junctionFromAboveSingle.contains(neighbour)) {
                          graphics.setCharacter(column, lowerRow, borderCharacter.withCharacter(Symbols.SINGLE_LINE_T_UP));
                      }
                      else if(junctionFromAboveDouble.contains(neighbour)) {
                          graphics.setCharacter(column, lowerRow, borderCharacter.withCharacter(Symbols.SINGLE_LINE_T_DOUBLE_UP));
                      }
                  }
                  else if(borderCharacter.getCharacter() == Symbols.DOUBLE_LINE_HORIZONTAL) {
                      if(junctionFromAboveSingle.contains(neighbour)) {
                          graphics.setCharacter(column, lowerRow, borderCharacter.withCharacter(Symbols.DOUBLE_LINE_T_SINGLE_UP));
                      }
                      else if(junctionFromAboveDouble.contains(neighbour)) {
                          graphics.setCharacter(column, lowerRow, borderCharacter.withCharacter(Symbols.DOUBLE_LINE_T_UP));
                      }
                  }
              }
          }
  
          //Go vertically and check horizontal neighbours if it's possible to extend lines into the border
          for(int row = 1; row < drawableArea.getRows() - 1; row++) {
              //Check first column
              TextCharacter borderCharacter = graphics.getCharacter(leftRow, row);
              if(borderCharacter == null) {
                  continue;
              }
              TextCharacter neighbourCharacter = graphics.getCharacter(leftRow + 1, row);
              if(neighbourCharacter != null) {
                  char neighbour = neighbourCharacter.getCharacter();
                  if(borderCharacter.getCharacter() == Symbols.SINGLE_LINE_VERTICAL) {
                      if(junctionFromRightSingle.contains(neighbour)) {
                          graphics.setCharacter(leftRow, row, borderCharacter.withCharacter(Symbols.SINGLE_LINE_T_RIGHT));
                      }
                      else if(junctionFromRightDouble.contains(neighbour)) {
                          graphics.setCharacter(leftRow, row, borderCharacter.withCharacter(Symbols.SINGLE_LINE_T_DOUBLE_RIGHT));
                      }
                  }
                  else if(borderCharacter.getCharacter() == Symbols.DOUBLE_LINE_VERTICAL) {
                      if(junctionFromRightSingle.contains(neighbour)) {
                          graphics.setCharacter(leftRow, row, borderCharacter.withCharacter(Symbols.DOUBLE_LINE_T_SINGLE_RIGHT));
                      }
                      else if(junctionFromRightDouble.contains(neighbour)) {
                          graphics.setCharacter(leftRow, row, borderCharacter.withCharacter(Symbols.DOUBLE_LINE_T_RIGHT));
                      }
                  }
              }
  
              //Check last column
              borderCharacter = graphics.getCharacter(rightRow, row);
              if(borderCharacter == null) {
                  continue;
              }
              neighbourCharacter = graphics.getCharacter(rightRow - 1, row);
              if(neighbourCharacter != null) {
                  char neighbour = neighbourCharacter.getCharacter();
                  if(borderCharacter.getCharacter() == Symbols.SINGLE_LINE_VERTICAL) {
                      if(junctionFromLeftSingle.contains(neighbour)) {
                          graphics.setCharacter(rightRow, row, borderCharacter.withCharacter(Symbols.SINGLE_LINE_T_LEFT));
                      }
                      else if(junctionFromLeftDouble.contains(neighbour)) {
                          graphics.setCharacter(rightRow, row, borderCharacter.withCharacter(Symbols.SINGLE_LINE_T_DOUBLE_LEFT));
                      }
                  }
                  else if(borderCharacter.getCharacter() == Symbols.DOUBLE_LINE_VERTICAL) {
                      if(junctionFromLeftSingle.contains(neighbour)) {
                          graphics.setCharacter(rightRow, row, borderCharacter.withCharacter(Symbols.DOUBLE_LINE_T_SINGLE_LEFT));
                      }
                      else if(junctionFromLeftDouble.contains(neighbour)) {
                          graphics.setCharacter(rightRow, row, borderCharacter.withCharacter(Symbols.DOUBLE_LINE_T_LEFT));
                      }
                  }
              }
          }
      }