sclass Substring implements /*Comparable,*/ CharSequence { CharSequence s; // full string we reference int i, l; // starting index, length *() {} *(CharSequence *s, int *i, int j) { l = j-i; } *(CharSequence *s, int *i) { l = s.length()-i; } public bool equals(O o) { if (o cast CharSequence) { CharSequence c = o; if (l != c.length()) false; for idx to l: if (s.charAt(i+idx) != c.charAt(idx)) false; true; } false; } toString { ret charSequenceToStringByChar(this); } public char charAt(int index) { if (index < 0 || index >= l) fail("Index out of range: " + index + " (length: " + l + ")"); ret s.charAt(i+index); } public int length() { ret l; } public int startIndex() { ret i; } public int endIndex() { ret i+l; } public CharSequence baseString() { ret s; } IntRange range() { ret IntRange(startIndex(), endIndex()); } public CharSequence subSequence(int start, int end) { ret substring(start, end); } // TODO: index checking Substring substring(int start, int end) { ret Substring(s, i+start, i+end); } Substring substring(int start) { ret substring(start, l); } bool endsAtEnd() { ret i+l == s.length(); } }