Mercurial Hosting > luan
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;