static IterableIterator scanLog_iterator_allowNonQuoted(S progID, S fileName) { ret scanLog_iterator_allowNonQuoted(getProgramFile(progID, fileName)); } static IterableIterator scanLog_iterator_allowNonQuoted(S fileName) { ret scanLog_iterator_allowNonQuoted(getProgramFile(fileName)); } static IterableIterator scanLog_iterator(File file) { // TODO: opens all at once final Iterator it = chainIterators(map linesFromFile( concatLists(earlierPartsOfLogFile(file), ll(file)))); ret iteratorFromFunction(func -> S { while (it.hasNext()) { S s = it.next(); if (isProperlyQuoted(s)) ret unquote(s); else if (nempty(s)) ret s; } null; }); }