    """Builder utility for constructing [[strings|String]] by
       incrementally appending strings or characters.

           value builder = StringBuilder();
           builder.append("hello");
           builder.appendCharacter(' ');
           builder.append("world");
           String hello = builder.string; //hello world"""
    shared native final class StringBuilder() satisfies List<Character> {

        "The number characters in the current content, that is,
         the [[size|String.size]] of the produced [[string]]."
        shared actual native Integer size;

        "The resulting string. If no characters have been
         appended, the empty string."
        shared actual native String string;

        "Returns a string of the given [[length]] containing
         the characters beginning at the given [[index]]."
        shared native String substring(Integer index, Integer length);

        shared actual native Iterator<Character> iterator();

        shared actual native Character? getFromFirst(Integer index);

        shared actual native Integer? lastIndex;

        "Append the characters in the given [[string]]."
        shared native StringBuilder append(String string);

        "Append the characters in the given [[strings]]."
        shared native StringBuilder appendAll({String*} strings) {
            for (s in strings) {
                append(s);
            }
            return this;
        }

        "Prepend the characters in the given [[string]]."
        shared native StringBuilder prepend(String string);

        "Prepend the characters in the given [[strings]]."
        shared native StringBuilder prependAll({String*} strings) {
            for (s in strings) {
                prepend(s);
            }
            return this;
        }

        "Append the given [[character]]."
        shared native StringBuilder appendCharacter(Character character);

        "Prepend the given [[character]]."
        shared native StringBuilder prependCharacter(Character character);

        "Append a newline character."
        shared native StringBuilder appendNewline()
                => appendCharacter('\n');

        "Append a space character."
        shared native StringBuilder appendSpace()
                => appendCharacter(' ');

        "Remove all content and return to initial state."
        shared native StringBuilder clear();

        "Insert a [[string]] at the specified [[index]]."
        shared native StringBuilder insert(Integer index,
            String string);

        "Insert a [[character]] at the specified [[index]]."
        shared native StringBuilder insertCharacter(Integer index,
            Character character) ;

        "Replaces the specified [[number of characters|length]]
         from the current content, starting at the specified
         [[index]], with the given [[string]]. If `length` is
         nonpositive, nothing is replaced."
        shared native StringBuilder replace(Integer index,
            Integer length, String string);

        "Deletes the specified [[number of characters|length]]
         from the current content, starting at the specified
         [[index]]. If `length` is nonpositive, nothing is
         deleted."
        shared native StringBuilder delete(Integer index,
            Integer length/*=1*/);

        "Deletes the specified [[number of characters|length]]
         from the start of the string. If `length` is
         nonpositive, nothing is deleted."
        shared native StringBuilder deleteInitial(Integer length);

        "Deletes the specified [[number of characters|length]]
         from the end of the string. If `length` is nonpositive,
         nothing is deleted."
        shared native StringBuilder deleteTerminal(Integer length);

        "Reverses the order of the current characters."
        shared native StringBuilder reverseInPlace();

        shared actual native Boolean equals(Object that);
        shared actual native Integer hash;

    }