"Since sequences are immutable, this class is used for
 constructing a new sequence by incrementally appending 
 elements to the empty sequence. This class is mutable
 but threadsafe."
see (`class SequenceAppender`, 
     `function concatenate`, 
     `class Singleton`)
shared native class SequenceBuilder<Element>() {
    
    "The resulting sequence. If no elements have been
     appended, the empty sequence."
    shared native default Element[] sequence;
    
    "Append an element to the sequence and return this 
     `SequenceBuilder`"
    shared native SequenceBuilder<Element> append(Element element);
    
    "Append multiple elements to the sequence and return 
     this `SequenceBuilder`"
    default shared SequenceBuilder<Element> appendAll({Element*} elements) {
        for (element in elements) {
            append(element);
        }
        return this;
    }
    
    "The size of the resulting sequence."
    shared Integer size => sequence.size;
    
    "Determine if the resulting sequence is empty."
    shared Boolean empty => size==0;
    
}

"This class is used for constructing a new nonempty 
 sequence by incrementally appending elements to an
 existing nonempty sequence. The existing sequence is
 not modified, since `Sequence`s are immutable. This 
 class is mutable but threadsafe."
see (`class SequenceBuilder`)
shared native class SequenceAppender<Element>([Element+] elements) 
        extends SequenceBuilder<Element>() {
    
    "The resulting nonempty sequence. If no elements 
     have been appended, the original nonempty 
     sequence."
    shared actual native [Element+] sequence;
    
}