package com.googlecode.totallylazy.collections; import com.googlecode.totallylazy.functions.Function1; import com.googlecode.totallylazy.Pair; import com.googlecode.totallylazy.predicates.Predicate; import java.util.Comparator; import java.util.List; import java.util.NoSuchElementException; import static com.googlecode.totallylazy.Callers.call; public interface TreeMap<K, V> extends PersistentSortedMap<K, V> { Comparator<K> comparator(); K key(); V value(); TreeMap<K, V> left(); TreeMap<K, V> left(TreeMap<K, V> newLeft); TreeMap<K, V> right(); TreeMap<K, V> right(TreeMap<K, V> newRight); TreeMap<K, V> rotateLeft(); TreeMap<K, V> rotateRight(); @Override TreeMap<K, V> empty(); @Override TreeMap<K, V> cons(Pair<K, V> head); @Override TreeMap<K, V> tail() throws NoSuchElementException; @Override TreeMap<K, V> insert(K key, V value); @Override TreeMap<K, V> delete(K key); @Override Pair<? extends TreeMap<K, V>, Pair<K, V>> removeFirst(); @Override Pair<? extends TreeMap<K, V>, Pair<K, V>> removeLast(); TreeFactory factory(); class methods { public static <K, V> TreeMap<K, V> treeMap(final TreeFactory factory, final Comparator<K> comparator, final List<Pair<K, V>> sortedList) { if(sortedList.size() == 0) return factory.create(comparator); int middle = sortedList.size() / 2; Pair<K, V> pair = sortedList.get(middle); TreeMap<K, V> left = treeMap(factory, comparator, sortedList.subList(0, middle)); TreeMap<K, V> right = treeMap(factory, comparator, sortedList.subList(middle + 1, sortedList.size())); return factory.create(comparator, pair.first(), pair.second(), left, right); } } class functions { public static <K, V> Function1<TreeMap<K, V>, TreeMap<K, V>> replace(final K key, final V value) { return focus -> focus.factory().create(focus.comparator(), key, value, focus.left(), focus.right()); } public static <K, V> Function1<TreeMap<K, V>, TreeMap<K, V>> remove() { return focus -> focus.delete(focus.key()); } } }