code: public static StreamEx<String> ofLines(Reader reader) {
          if (reader instanceof BufferedReader)
              return ofLines((BufferedReader) reader);
          return ofLines(new BufferedReader(reader));
      }
docs: Returns a {@code StreamEx}, the elements of which are lines read from the
  supplied {@link Reader}. The {@code StreamEx} is lazily populated, i.e.,
  read only occurs during the terminal stream operation.
  
  <p>
  The reader must not be operated on during the execution of the terminal
  stream operation. Otherwise, the result of the terminal stream operation
  is undefined.
  
  <p>
  After execution of the terminal stream operation there are no guarantees
  that the reader will be at a specific position from which to read the
  next character or line.
  
  <p>
  If an {@link IOException} is thrown when accessing the underlying
  {@code Reader}, it is wrapped in an {@link UncheckedIOException} which
  will be thrown from the {@code StreamEx} method that caused the read to
  take place. This method will return a StreamEx if invoked on a Reader
  that is closed. Any operation on that stream that requires reading from
  the Reader after it is closed, will cause an UncheckedIOException to be
  thrown.
  
  @param reader the reader to get the lines from
  @return a {@code StreamEx<String>} providing the lines of text described
  by supplied {@code Reader}
  @see #ofLines(BufferedReader)