Cursor 0..n-1. If singleElement!=null, cursor is 0 until you next(), which bumps it to 1 meaning no more elements.
Once a node / subtree has been used in a stream, it must be dup'd from then on. Streams are reset after subrules so that the streams can be reused in future subrules. So, reset must set a dirty bit. If dirty, then next() always returns a dup.
The element or stream description; usually has name of the token or rule reference that this list tracks. Can include rulename too, but the exception would track that info.
The list of tokens or subtrees we are tracking
Track single elements w/o creating a list. Upon 2nd add, alloc list
Do the work of getting the next element, making sure that it's a tree node or subtree. Deal with the optimization of single- element list versus list of size > 1. Throw an exception if the stream is empty or we're out of elements and size>1. protected so you can override in a subclass if necessary.
Get next token from stream and make a node for it
Return the next element in the stream. If out of elements, throw an exception unless size()==1. If size is 1, then return elements[0]. Return a duplicate node/subtree if stream is out of elements and size==1. If we've already used the element, dup (dirty bit set).
Reset the condition of this stream so that it appears we have not consumed any of its elements. Elements themselves are untouched. Once we reset the stream, any future use will need duplicates. Set the dirty bit.
Don't convert to a tree unless they explicitly call nextTree. This way we can do hetero tree nodes in rewrite.
Generated using TypeDoc
Create a stream, but feed off an existing list