package erjang.m.java;
import erjang.ECons;
import erjang.EList;
import erjang.EObject;
import erjang.EProc;
import erjang.ERT;
import erjang.ESeq;
import erjang.ESmall;
import erjang.EString;
import erjang.EStringList;
/** Wrap an java.lang.CharSequence and present it as an ESeq */
class JavaCharSeq extends ESeq {
private final CharSequence seq;
private final int pos;
private EProc self;
public ECons testNonEmptyList() {
if (seq.length() == pos)
return null;
return this;
}
@Override
public EString testString() {
return EString.make(seq, pos, seq.length());
}
static ESeq box(EProc self, CharSequence cs, int pos) {
if (cs.length() == pos)
return ERT.NIL;
return new JavaCharSeq(self, cs, pos);
}
private JavaCharSeq(EProc self, CharSequence cs, int pos) {
this.seq = cs;
this.pos = pos;
this.self = self;
}
@Override
public ESeq cons(EObject h) {
ESmall s;
if ((s = h.testSmall()) != null) {
if ((s.value & 0xff) == s.value) {
return new EStringList((byte) s.value, this);
}
}
return new EList(h, this);
}
@Override
public ESeq tail() {
return box(self, seq, pos + 1);
}
@Override
public EObject head() {
return ERT.box(seq.charAt(pos));
}
@Override
public int hashCode() {
return seq.hashCode();
}
//TODO: equality operators
}