package com.codepoetics.octarine.records; import org.pcollections.HashTreePMap; import org.pcollections.PMap; import java.util.HashMap; import java.util.Map; public interface MapKey<T> extends Key<PMap<String, T>> { static <T> MapKey<T> named(String name, Value...metadata) { return named(name, Record.of(metadata)); } static <T> MapKey<T> named(String name, Record metadata) { return new Impl<T>(name, metadata); } static final class Impl<T> extends BaseKey<PMap<String, T>> implements MapKey<T> { Impl(String name, Record metadata) { super(name, metadata); } } default Value of(Map<String, ? extends T> values) { return of(HashTreePMap.from(values)); } default Value of(String key1, T value1) { Map<String, T> target = new HashMap<>(); target.put(key1, value1); return of(target); } default Value of(String key1, T value1, String key2, T value2) { Map<String, T> target = new HashMap<>(); target.put(key1, value1); target.put(key2, value2); return of(target); } default Value of(String key1, T value1, String key2, T value2, String key3, T value3) { Map<String, T> target = new HashMap<>(); target.put(key1, value1); target.put(key2, value2); target.put(key3, value3); return of(target); } default Value of(String key1, T value1, String key2, T value2, String key3, T value3, String key4, T value4) { Map<String, T> target = new HashMap<>(); target.put(key1, value1); target.put(key2, value2); target.put(key3, value3); target.put(key4, value4); return of(target); } default Value of(String key1, T value1, String key2, T value2, String key3, T value3, String key4, T value4, String key5, T value5) { Map<String, T> target = new HashMap<>(); target.put(key1, value1); target.put(key2, value2); target.put(key3, value3); target.put(key4, value4); target.put(key5, value5); return of(target); } default Value of(String key1, T value1, String key2, T value2, String key3, T value3, String key4, T value4, String key5, T value5, String key6, T value6) { Map<String, T> target = new HashMap<>(); target.put(key1, value1); target.put(key2, value2); target.put(key3, value3); target.put(key4, value4); target.put(key5, value5); target.put(key6, value6); return of(target); } }