Mercurial Hosting > nabble
diff src/nabble/naml/namespaces/ListSequence.java @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/nabble/naml/namespaces/ListSequence.java Thu Mar 21 19:15:52 2019 -0600 @@ -0,0 +1,117 @@ +package nabble.naml.namespaces; + +import nabble.naml.compiler.Command; +import nabble.naml.compiler.CommandSpec; +import nabble.naml.compiler.IPrintWriter; +import nabble.naml.compiler.Interpreter; +import nabble.naml.compiler.Namespace; + +import java.util.List; + + +@Namespace ( + name = "list", + global = true +) +public class ListSequence<T> extends Sequence { + protected final List<T> elements; + protected int index = -1; + + public ListSequence(List<T> elements) { + this.elements = elements; + } + + protected final T get() { + return elements.get(index); + } + + protected final T getPrevious() { + return index == 0? null : elements.get(index-1); + } + + public static final CommandSpec has_more_elements = new CommandSpec.Builder() + .dotParameter("n") + .optionalParameters("n") + .build() + ; + + @Command public final void has_more_elements(IPrintWriter out,Interpreter interp) { + int n = interp.getArgAsInt("n", 1); + out.print( index+n < elements.size() ); + } + + public static final CommandSpec next_element = new CommandSpec.Builder() + .optionalParameters("inc") + .build() + ; + + @Command public void next_element(IPrintWriter out,Interpreter interp) { + int inc = interp.getArgAsInt("inc", 1); + index += inc; + out.print( index < elements.size() ); + } + + @Command public void current_element(IPrintWriter out,Interpreter interp) { + out.print( get() ); + } + + @Command public void element_count(IPrintWriter out,Interpreter interp) { + out.print( elements.size() ); + } + + @Command public void is_last_element(IPrintWriter out,Interpreter interp) { + out.print( index == elements.size()-1); + } + + @Command public void is_first_element(IPrintWriter out,Interpreter interp) { + out.print( index == 0); + } + + @Command public void list_is_empty(IPrintWriter out,Interpreter interp) { + out.print( elements.isEmpty() ); + } + + public static final CommandSpec remove_current_element = CommandSpec.NO_OUTPUT; + + @Command public void remove_current_element(IPrintWriter out,Interpreter interp) { + elements.remove(index--); + } + + public static final CommandSpec reset_list_index = CommandSpec.NO_OUTPUT; + + @Command public void reset_list_index(IPrintWriter out,Interpreter interp) { + index = -1; + } + + @Command public void current_index(IPrintWriter out,Interpreter interp) { + out.print(index); + } + + public static final CommandSpec has_element_at = new CommandSpec.Builder() + .parameters("index") + .build() + ; + + @Command public void has_element_at(IPrintWriter out,Interpreter interp) { + int index = interp.getArgAsInt("index"); + out.print( index < elements.size() ); + } + + public static final CommandSpec join = new CommandSpec.Builder() + .dotParameter("do") + .parameters("separator") + .build() + ; + + @Command public void join(IPrintWriter out,Interpreter interp) { + Object todo = interp.getArg("do"); + String separator = interp.getArgString("separator"); + StringBuilder buf = new StringBuilder(); + for( index = 0; index < elements.size(); index++ ) { + if( index > 0 ) + buf.append( separator ); + buf.append( todo ); + } + out.print( buf ); + } +}