diff src/luan/LuanMeta.java @ 775:1a68fc55a80c

simplify dir structure
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 26 Aug 2016 14:36:40 -0600
parents core/src/luan/LuanMeta.java@d9df6d6cb927
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/LuanMeta.java	Fri Aug 26 14:36:40 2016 -0600
@@ -0,0 +1,69 @@
+package luan;
+
+import java.util.Map;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.HashSet;
+
+
+public abstract class LuanMeta {
+
+	public abstract Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException;
+
+	protected abstract Iterator keys(LuanTable tbl);
+
+	public LuanFunction __pairs(final LuanState luan,final LuanTable tbl) {
+		return new LuanFunction() {
+			final Iterator<Map.Entry<Object,Object>> iter1 = tbl.rawIterator();
+			final Iterator<Object> iter2 = keys(tbl);
+			final Set<Object> set = new HashSet<Object>();
+
+			@Override public Object[] call(LuanState luan,Object[] args) throws LuanException {
+				if( iter1.hasNext() ) {
+					Map.Entry<Object,Object> entry = iter1.next();
+					Object key = entry.getKey();
+					set.add(key);
+					return new Object[]{key,entry.getValue()};
+				}
+				while( iter2.hasNext() ) {
+					Object key = iter2.next();
+					if( set.add(key) ) {
+						Object value = __index(luan,tbl,key);
+						return new Object[]{key,value};
+					}
+				}
+				return LuanFunction.NOTHING;
+			}
+		};
+	}
+
+	public boolean canNewindex() {
+		return false;
+	}
+
+	public void __new_index(LuanState luan,LuanTable tbl,Object key,Object value) throws LuanException {
+		throw new UnsupportedOperationException();
+	}
+
+	protected abstract String type(LuanTable tbl);
+
+	public String __to_string(LuanState luan,LuanTable tbl) throws LuanException {
+		return type(tbl) + "-" + tbl.rawToString();
+	}
+
+	public LuanTable newMetatable() {
+		LuanTable mt = new LuanTable();
+		mt.rawPut( "__index", this );
+		mt.rawPut( "__pairs", this );
+		mt.rawPut( "__to_string", this );
+		if( canNewindex() )
+			mt.rawPut( "__new_index", this );
+		return mt;
+	}
+
+	public LuanTable newTable() {
+		LuanTable tbl = new LuanTable();
+		tbl.setMetatable( newMetatable() );
+		return tbl;
+	}
+}