static IterableIterator lines_iterator(fS s) { if (s == null) ret emptyIterableIterator(); ret iteratorFromFunction(new F0 { int start = 0; S get() { int i = toLines_nextLineBreak(s, start); if (i < 0) { S toReturn = s.length() > start ? s.substring(start) : null; start = s.length(); ret toReturn; } S toReturn = s.substring(start, i); if (s.charAt(i) == '\r' && i+1 < s.length() && s.charAt(i+1) == '\n') i += 2; else ++i; start = i; ret toReturn; } }); }