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 );
+	}
+}