view core/src/luan/LuanPropertyTable.java @ 355:1bce334a816b

AbstractLuanTable now implements LuanRepr
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 14 Apr 2015 09:33:34 -0600
parents 392105b660d7
children 17b02b56d806
line wrap: on
line source

package luan;

import java.util.Set;
import java.util.Map;
import java.util.AbstractMap;
import java.util.Iterator;


class LuanPropertyTable extends LuanTableImpl {

	@Override public LuanTableImpl shallowClone() {
		return new LuanPropertyTable();
	}

	private Object fixValue(Object obj) {
		return obj instanceof LuanProperty ? ((LuanProperty)obj).get() : obj;
	}

	@Override String repr(Set<AbstractLuanTable> set,Object obj) {
		return super.repr(set,fixValue(obj));
	}

	@Override public Object get(Object key) {
		return fixValue(super.get(key));
	}

	@Override public void put(Object key,Object val) {
		Object v = super.get(key);
		if( v instanceof LuanProperty ) {
			LuanProperty lp = (LuanProperty)v;
			if( lp.set(val) )
				return;
		}
		super.put(key,val);
	}

	@Override public Iterator<Map.Entry<Object,Object>> iterator() {
		final Iterator<Map.Entry<Object,Object>> i = super.iterator();
		return new Iterator<Map.Entry<Object,Object>>() {
			public boolean hasNext() {
				return i.hasNext();
			}
			public Map.Entry<Object,Object> next() {
				Map.Entry<Object,Object> entry = i.next();
				Object v = entry.getValue();
				if( v instanceof LuanProperty ) {
					LuanProperty lp = (LuanProperty)v;
					return new AbstractMap.SimpleEntry<Object,Object>(entry.getKey(),lp.get());
				}
				return entry;
			}
			public void remove() {
				i.remove();
			}
		};
	}

}