package erjang.m.java; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import erjang.ECons; import erjang.EList; import erjang.ENil; import erjang.EObject; import erjang.EProc; import erjang.ERT; import erjang.ESeq; import erjang.ETuple2; class JavaMapIterator extends ESeq { final Iterator<Entry> rest; final Entry<?, ?> ent; private EProc self; @Override public ECons testNonEmptyList() { return this; } @Override public boolean isNil() { return false; } @Override public ENil testNil() { return null; } @SuppressWarnings("unchecked") static ESeq box(EProc self, Iterator<Map.Entry> iterator) { if (iterator.hasNext()) return new JavaMapIterator(self, iterator); return ERT.NIL; } @SuppressWarnings("unchecked") private JavaMapIterator(EProc self, Iterator<Map.Entry> it) { ent = it.next(); this.rest = it; this.self = self; } @Override public ESeq cons(EObject h) { return new EList(h, this); } @Override public ESeq tail() { ESeq tail = box(self, rest); return tail; } @Override public EObject head() { return new ETuple2(JavaObject.box(self, ent.getKey()), JavaObject.box(self, ent.getValue())); } @Override public int hashCode() { return rest.hashCode(); // What to do here? The iterator may be an infinite stream. } }