code: private static Opt<Integer> data(final InputStream input,
          final Opt<Integer> data, final boolean available) throws IOException {
          final Opt<Integer> ret;
          if (data.has()) {
              ret = data;
          } else if (available && input.available() <= 0) {
              ret = new Opt.Single<>(-1);
          } else {
              ret = new Opt.Single<>(input.read());
          }
          return ret;
      }
docs: Obtains new byte if hasn't.
  @param input Stream
  @param data Empty or current data
  @param available Indicates whether or not it should check first if there
  are available bytes
  @return Next or current data
  @throws IOException if input.read() fails