code: public JsonToken peek() throws IOException {
      if (token != null) {
        return token;
      }
  
      switch (stack[stackSize - 1]) {
      case EMPTY_DOCUMENT:
        if (lenient) {
          consumeNonExecutePrefix();
        }
        stack[stackSize - 1] = JsonScope.NONEMPTY_DOCUMENT;
        JsonToken firstToken = nextValue();
        if (!lenient && token != JsonToken.BEGIN_ARRAY && token != JsonToken.BEGIN_OBJECT) {
          throw new IOException("Expected JSON document to start with '[' or '{' but was " + token
              + " at line " + getLineNumber() + " column " + getColumnNumber());
        }
        return firstToken;
      case EMPTY_ARRAY:
        return nextInArray(true);
      case NONEMPTY_ARRAY:
        return nextInArray(false);
      case EMPTY_OBJECT:
        return nextInObject(true);
      case DANGLING_NAME:
        return objectValue();
      case NONEMPTY_OBJECT:
        return nextInObject(false);
      case NONEMPTY_DOCUMENT:
        int c = nextNonWhitespace(false);
        if (c == -1) {
          return JsonToken.END_DOCUMENT;
        }
        pos--;
        if (!lenient) {
          throw syntaxError("Expected EOF");
        }
        return nextValue();
      case CLOSED:
        throw new IllegalStateException("JsonReader is closed");
      default:
        throw new AssertionError();
      }
    }
docs: Returns the type of the next token without consuming it.