code: @GwtCompatible(serializable = true)
    public static <K extends Enum<K>, V> ImmutableMap<K, V> immutableEnumMap(
        Map<K, ? extends V> map) {
      if (map instanceof ImmutableEnumMap) {
        @SuppressWarnings("unchecked") // safe covariant cast
        ImmutableEnumMap<K, V> result = (ImmutableEnumMap<K, V>) map;
        return result;
      }
      Iterator<? extends Entry<K, ? extends V>> entryItr = map.entrySet().iterator();
      if (!entryItr.hasNext()) {
        return ImmutableMap.of();
      }
      Entry<K, ? extends V> entry1 = entryItr.next();
      K key1 = entry1.getKey();
      V value1 = entry1.getValue();
      checkEntryNotNull(key1, value1);
      Class<K> clazz = key1.getDeclaringClass();
      EnumMap<K, V> enumMap = new EnumMap<>(clazz);
      enumMap.put(key1, value1);
      while (entryItr.hasNext()) {
        Entry<K, ? extends V> entry = entryItr.next();
        K key = entry.getKey();
        V value = entry.getValue();
        checkEntryNotNull(key, value);
        enumMap.put(key, value);
      }
      return ImmutableEnumMap.asImmutable(enumMap);
    }
docs: Returns an immutable map instance containing the given entries. Internally, the returned map
  will be backed by an {@link EnumMap}.
  
  <p>The iteration order of the returned map follows the enum's iteration order, not the order in
  which the elements appear in the given map.
  
  @param map the map to make an immutable copy of
  @return an immutable map containing those entries
  @since 14.0