// returns pair(character range, line) or null if not found static Pair binarySearchForLineInTextFile(File file, IF1 nav) { long length = l(file); int bufSize = 1024; temp RandomAccessFile raf = randomAccessFileForReading(file); long min = 0, max = length; while ping (min < max) { long middle = (min+max)/2; long lineStart = raf_findBeginningOfLine(raf, middle, bufSize); long lineEnd = raf_findEndOfLine(raf, middle, bufSize); S line = fromUtf8(raf_readFilePart(raf, lineStart, lineEnd)); int direction = nav.get(line); if (direction == 0) ret pair(LongRange(lineStart, lineEnd), line); if (direction < 0) max = lineStart; else min = lineEnd; } // TODO: precise check null; }