package com.googlecode.totallylazy.collections;

import com.googlecode.totallylazy.functions.Callables;
import com.googlecode.totallylazy.Pair;
import com.googlecode.totallylazy.comparators.Comparators;

import java.util.Comparator;

import static com.googlecode.totallylazy.Sequences.sequence;
import static com.googlecode.totallylazy.Unchecked.cast;

public class TreeMapFactory<K, V, T extends TreeMap<K, V>> extends AbstractMapFactory<K, V, T> {
    private final TreeFactory factory;
    private final Comparator<K> comparator;

    protected TreeMapFactory(TreeFactory factory, Comparator<K> comparator) {
        this.factory = factory;
        this.comparator = comparator;
    }

    public static <K, V, T extends TreeMap<K, V>> TreeMapFactory<K, V, T> treeMapFactory(TreeFactory factory, Comparator<K> comparator) {
        return new TreeMapFactory<K, V, T>(factory, comparator);
    }

    public static <K extends Comparable<? super K>, V, T extends TreeMap<K, V>> TreeMapFactory<K, V, T> treeMapFactory(TreeFactory factory) {
        return new TreeMapFactory<K, V, T>(factory, Comparators.<K>ascending());
    }

    @Override
    public T empty() {
        return cast(factory.create(comparator));
    }

    @Override
    public T map(Iterable<? extends Pair<K, V>> values) {
        return cast(TreeMap.methods.treeMap(factory, comparator, sequence(values).toSortedList(Comparators.<Pair<K, V>, K>by(Callables.<K>first(), comparator))));
    }
}