package st.gravel.support.jvm; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; public class DictionaryExtensions { public static final Factory factory = new Factory(); public static class Factory extends SmalltalkFactory { public Object basicNew() { return new HashMap(); } } public static <K, V> K keyAtValue_(HashMap<K, V> receiver, V value) { for (Map.Entry<K, V> entry : receiver.entrySet()) { if (entry.getValue().equals(value)) return entry.getKey(); } throw new RuntimeException("Not found: key for :" + value); } public static Object do_(HashMap receiver, Object aBlock) { Block1 bl = (Block1) aBlock; for (Object element : receiver.values()) { bl.value_(element); } return receiver; } public static Object keysDo_(HashMap receiver, Object aBlock) { Block1 bl = (Block1) aBlock; for (Object element : receiver.keySet()) { bl.value_(element); } return receiver; } public static Object keys(HashMap receiver) { return new HashSet(receiver.keySet()); } public static Object keysAndValuesDo_( HashMap<? extends Object, ? extends Object> receiver, Object aBlock) { Block2 bl = (Block2) aBlock; for (Entry element : receiver.entrySet()) { bl.value_value_(element.getKey(), element.getValue()); } return receiver; } public static <K, V> Map<K, V> copyAt_put_(Map<K, V> receiver, K key, V value) { HashMap<K, V> copy = new HashMap<K, V>(receiver); copy.put(key, value); return copy; } public static boolean includesKey_(Map receiver, Object key) { return receiver.containsKey(key); } public static <K, V> V at_put_(Map<K, V> receiver, K key, V value) { receiver.put(key, value); return value; } public static <K, V> V at_ifAbsent_(Map<K, V> receiver, K key, Block0<V> absentBlock) { if (receiver.containsKey(key)) return receiver.get(key); return absentBlock.value(); } public static <K, V> Map<K, V> copy(Map<K, V> receiver) { return new HashMap<K, V>(receiver); } public static <K, O, N> void syncWith(Map<K, O> receiver, Map<K, N> other, Block2<Object, O, N> thenBlock, Block1<Object, N> ifNewBlock, Block1<Object, O> ifAbsentBlock) { final HashSet<K> oKeys = new HashSet<K>(receiver.keySet()); final HashSet<K> nKeys = new HashSet<K>(other.keySet()); for (K oKey : oKeys) { if (nKeys.remove(oKey)) { thenBlock.value_value_(receiver.get(oKey), other.get(oKey)); } else { ifAbsentBlock.value_(receiver.get(oKey)); } } for (K nKey : nKeys) { ifNewBlock.value_(other.get(nKey)); } } public static boolean equals_(Map receiver, Map other) { if (receiver == other) return true; if (receiver.size() != other.size()) return false; for (Object key : receiver.keySet()) { if (!ObjectExtensions.equals_(receiver.get(key), other.get(key))) return false; } return true; } public static <K, V> Map<K, V> copyAt_ifAbsentPut_(Map<K, V> receiver, K key, Block0<V> absentBlock) { if (receiver.containsKey(key)) return receiver; return copyAt_put_(receiver, key, absentBlock.value()); } public static String asJSON(Map<String, ? extends Object> _dict) { throw new UnsupportedOperationException("Not Implemented Yet"); } public static <K, V> Map<K, V> copyRemoveKey_ifAbsent_(Map<K, V> receiver, K key, Block0<Object> absentBlock) { if (!receiver.containsKey(key)) { absentBlock.value(); return receiver; } HashMap<K, V> copy = new HashMap<K, V>(receiver); copy.remove(key); return copy; } public static <K, V> Map<K, V> reject_(Map<K, V> receiver, Predicate1<V> predicate) { HashMap<K, V> hashMap = new HashMap<>(); for (Entry<K, V> element : receiver.entrySet()) { if (!predicate.value_(element.getValue())) { hashMap.put(element.getKey(), element.getValue()); } } return hashMap; } public static <K, V> Map<K, V> select_(Map<K, V> receiver, Predicate1<V> predicate) { HashMap<K, V> hashMap = new HashMap<>(); for (Entry<K, V> element : receiver.entrySet()) { if (predicate.value_(element.getValue())) { hashMap.put(element.getKey(), element.getValue()); } } return hashMap; } public static <K, O, T> Map<K, T> collect_(Map<K, O> receiver, Block1<T, O> aBlock) { HashMap<K, T> hashMap = new HashMap<>(); for (Entry<K, O> element : receiver.entrySet()) { hashMap.put(element.getKey(), aBlock.value_(element.getValue())); } return hashMap; } }