package erjang.m.java; import java.util.Iterator; import erjang.EList; import erjang.EObject; import erjang.EProc; import erjang.ERT; import erjang.ESeq; /** Wrap an java.util.Iterator and present it as an ESeq */ class JavaIterator extends ESeq { Iterator<?> rest; Object head; private EProc self; static ESeq box(EProc self, Iterator<?> it) { if (it.hasNext()) return new JavaIterator(self, it); return ERT.NIL; } private JavaIterator(EProc self, Iterator<?> it) { this.head = it.next(); this.rest = it; this.self = self; } @Override public ESeq cons(EObject h) { return new EList(h, this); } @Override public ESeq tail() { return box(self, rest); } @Override public EObject head() { return JavaObject.box(self, head); } @Override public int hashCode() { return head.hashCode() + rest.hashCode(); // What to do here? The iterator may be an infinite stream. } }