
package de.ivu.elect.util;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

/**
 * Stellt Methoden bereit, die (lazy) unter einem gegebenen Key in einer gegebenen Map automatisch eine leere Collection
 * des gewünschten Typs einfügen, falls der Key noch nicht existiert.
 *
 * Diese Klasse ist durch die Methode Map#computeIfAbsent() überflüssig geworden.
 * 
 * @author
 */
public class MultiMapUtil {

  /**
   * Liefert aus der Map <code>multimap</code> die {@link List} zum gegebenen <code>key</code>. Wenn diese fehlt, füge
   * eine neue {@link ArrayList} ein.
   */
  public static <K, T> List<T> getArrayList(Map<K, List<T>> multimap, K key) {
    return multimap.computeIfAbsent(key, egal -> new ArrayList<>());
  }

  /**
   * Liefert aus der Map <code>multimap</code> das {@link Set} zum gegebenen <code>key</code>. Wenn dieses fehlt, füge
   * eine neues {@link HashSet} ein.
   */
  public static <K, T> Set<T> getHashSet(Map<K, Set<T>> multimap, K key) {
    return multimap.computeIfAbsent(key, egal -> new HashSet<>());
  }

  /**
   * Liefert aus der Map <code>multimap</code> das {@link Set} zum gegebenen <code>key</code>. Wenn dieses fehlt, füge
   * eine neues {@link LinkedHashSet} ein.
   */
  public static <K, T> Set<T> getLinkedHashSet(Map<K, Set<T>> multimap, K key) {
    return multimap.computeIfAbsent(key, egal -> new LinkedHashSet<>());
  }

  /**
   * Liefert aus der Map <code>multimap</code> das {@link SortedSet} zum gegebenen <code>key</code>. Wenn dieses fehlt,
   * füge eine neues {@link TreeSet} ein.
   */
  public static <K, T> SortedSet<T> getTreeSet(Map<K, SortedSet<T>> multimap, K key) {
    return multimap.computeIfAbsent(key, egal -> new TreeSet<>());
  }

}
