code: static final JSType getElementType(JSType iterableOrIterator, JSTypeRegistry typeRegistry) {
      TemplateTypeMap templateTypeMap =
          iterableOrIterator
              // Remember that `string` will box to a `Iterable`.
              .autobox()
              .getTemplateTypeMap();
  
      if (templateTypeMap.hasTemplateKey(typeRegistry.getIterableTemplate())) {
        // `Iterable<SomeElementType>` or `Generator<SomeElementType>`
        return templateTypeMap.getResolvedTemplateType(typeRegistry.getIterableTemplate());
      } else if (templateTypeMap.hasTemplateKey(typeRegistry.getIteratorTemplate())) {
        // `Iterator<SomeElementType>`
        return templateTypeMap.getResolvedTemplateType(typeRegistry.getIteratorTemplate());
      } else if (templateTypeMap.hasTemplateKey(typeRegistry.getAsyncIterableTemplate())) {
        // `AsyncIterable<SomeElementType>` or `AsyncGenerator<SomeElementType>`
        return templateTypeMap.getResolvedTemplateType(typeRegistry.getAsyncIterableTemplate());
      } else if (templateTypeMap.hasTemplateKey(typeRegistry.getAsyncIteratorTemplate())) {
        // `AsyncIterator<SomeElementType>`
        return templateTypeMap.getResolvedTemplateType(typeRegistry.getAsyncIteratorTemplate());
      }
      return typeRegistry.getNativeType(UNKNOWN_TYPE);
    }
docs: Returns the given `Iterable`s element type.
  
  <p>If the given type is not an `Iterator`, `Iterable`, `AsyncIterator`, or `AsyncIterable`,
  returns the unknown type.