public T openBlock(String textBeforeNewline, String textAfterNewline, Runnable f) {
        return openBlock(textBeforeNewline, textAfterNewline, new Object[] {}, f);
    }
Opens a block of syntax by writing {@code textBeforeNewline}, a newline, then
indenting, then executes the given {@code Runnable}, then closes the block of
syntax by writing a newline, dedenting, then writing {@code textAfterNewline}.

<pre>{@code
SimpleCodeWriter = new SimpleCodeWriter();
writer.openBlock("public final class $L {", "}", "Foo", () -> {
    writer.openBlock("public void main(String[] args) {", "}", () -> {
        writer.write("System.out.println(args[0]);");
    })
});
}</pre>

@param textBeforeNewline Text to write before writing a newline and indenting.
@param textAfterNewline Text to write after writing a newline and indenting.
@param f Runnable function to execute inside of the block.
@return Returns this.
smithy-utils/src/main/java/software/amazon/smithy/utils/AbstractCodeWriter.java