|  | // Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | package com.android.tools.r8.utils; | 
|  |  | 
|  | import com.android.tools.r8.utils.StringUtils.BraceType; | 
|  | import java.util.Map; | 
|  | import java.util.function.BiFunction; | 
|  | import java.util.function.Function; | 
|  | import java.util.function.IntFunction; | 
|  |  | 
|  | public class MapUtils { | 
|  |  | 
|  | public static <K, V> K firstKey(Map<K, V> map) { | 
|  | return map.keySet().iterator().next(); | 
|  | } | 
|  |  | 
|  | public static <K, V> V firstValue(Map<K, V> map) { | 
|  | return map.values().iterator().next(); | 
|  | } | 
|  |  | 
|  | public static <K, V> Map<K, V> map( | 
|  | Map<K, V> map, | 
|  | IntFunction<Map<K, V>> factory, | 
|  | Function<K, K> keyMapping, | 
|  | Function<V, V> valueMapping, | 
|  | BiFunction<V, V, V> valueMerger) { | 
|  | Map<K, V> result = factory.apply(map.size()); | 
|  | map.forEach( | 
|  | (key, value) -> { | 
|  | K newKey = keyMapping.apply(key); | 
|  | V newValue = valueMapping.apply(value); | 
|  | V existingValue = result.put(newKey, newValue); | 
|  | if (existingValue != null) { | 
|  | result.put(newKey, valueMerger.apply(existingValue, newValue)); | 
|  | } | 
|  | }); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | public static <T> void removeIdentityMappings(Map<T, T> map) { | 
|  | map.entrySet().removeIf(entry -> entry.getKey() == entry.getValue()); | 
|  | } | 
|  |  | 
|  | public static String toString(Map<?, ?> map) { | 
|  | return StringUtils.join( | 
|  | ",", map.entrySet(), entry -> entry.getKey() + ":" + entry.getValue(), BraceType.TUBORG); | 
|  | } | 
|  | } |