diff core/src/luan/LuanMeta.java @ 413:8937263f59f6

add __pairs; add back HttpServicer.get_parameter_values;
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 29 Apr 2015 19:01:18 -0600
parents 1b38de2b1845
children ce8e19567911
line wrap: on
line diff
--- a/core/src/luan/LuanMeta.java	Wed Apr 29 16:28:18 2015 -0600
+++ b/core/src/luan/LuanMeta.java	Wed Apr 29 19:01:18 2015 -0600
@@ -1,13 +1,41 @@
 package luan;
 
 import java.util.Map;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.HashSet;
 
 
-public abstract class LuanMeta /*implements Iterable<Map.Entry<Object,Object>>*/ {
+public abstract class LuanMeta {
 
 	public abstract Object __index(LuanState luan,LuanTable tbl,Object key) throws LuanException;
 
-//	public abstract LuanFunction __pairs(LuanState luan,LuanTable tbl) throws LuanException;
+	protected abstract Iterator keys();
+
+	public LuanFunction __pairs(final LuanState luan,final LuanTable tbl) {
+		return new LuanFunction() {
+			final Iterator<Map.Entry<Object,Object>> iter1 = tbl.iterator();
+			final Iterator<Object> iter2 = keys();
+			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;
@@ -19,22 +47,8 @@
 
 	public LuanTable newMetatable() {
 		LuanTable mt = new LuanTable();
-/*
-		try {
-			mt.put( "__index", new LuanJavaFunction(
-				LuanMeta.class.getMethod( "__index", LuanState.class, LuanTable.class, Object.class ), this
-			) );
-			if( canNewindex() ) {
-				mt.put( "__newindex", new LuanJavaFunction(
-					LuanMeta.class.getMethod( "__newindex", LuanState.class, LuanTable.class, Object.class, Object.class ), mt
-				) );
-			}
-		} catch(NoSuchMethodException e) {
-			throw new RuntimeException(e);
-		}
-*/
 		mt.put( "__index", this );
-//		mt.put( "__pairs", this );
+		mt.put( "__pairs", this );
 		if( canNewindex() )
 			mt.put( "__newindex", this );
 		return mt;