// abstraction of linked list - allows you to add arbitrary data
var ArrayList:=class LinkedList
(	
	var init:=method x
	{
		super;
		try
		(
			var i:=0;
			while (true)
			(
				aadd[x[i]];
				i:=i + 1;
			);
		) catch "" (
			skip;
		);		
	};
	var clone:=method[]
	{
		var newlist:=new ArrayList[];
		var i:=agetiterator[];
		while (i.hasNext[])
		(
			newlist.aadd[i.next[].getdata[]];
		);
		return newlist;
	};
	var aadd:=method[toadd] laddtotail[toadd];
	var aget:=method[idex] return lget[idex];
	var aput:=method[idex,data] lput[idex,data];
	var aset:=method[idex,data] lset[idex,data];
	var aremove:=method[idex] lremove[idex]; 
	var agetiterator:=method[] return new iterator[this];
);

var customstring:=class Value
(
	var dynamic contents:=new ArrayList[];
	
	var add:=method[x]
	(
		contents.aadd[x];
	);
	
	var printing:=method[]
	{
		var i:=contents.agetiterator[];
		while (i.hasNext[])
		(
			print ((i.next[]).getdata[]);
		);	
	};
);