package ca.odell.glazedlists.example;

import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.GlazedLists;
import ca.odell.glazedlists.FunctionList;

import java.util.List;
import java.util.Map;
import java.util.Iterator;
import java.util.Arrays;

public class MultiMapExample {

    private static class Food {
        private final String name;
        private final String group;

        public Food(String name, String group) {
            this.name = name;
            this.group = group;
        }

        public String getName() {
            return name;
        }

        public String getGroup() {
            return group;
        }

        public String toString() {
            return name;
        }
    }

    public static void main(String[] args) {
        final EventList<Food> foods = new BasicEventList<Food>();
        foods.add(new Food("carrot", "vegetables"));
        foods.add(new Food("ice cream", "dairy"));
        foods.add(new Food("rice", "grains"));
        foods.add(new Food("banana", "fruits"));
        foods.add(new Food("cherry", "fruits"));
        foods.add(new Food("corn", "vegetables"));
        foods.add(new Food("bread", "grains"));
        foods.add(new Food("salmon", "meat"));
        foods.add(new Food("steak", "meat"));
        foods.add(new Food("lobster", "meat"));

        Map<Comparable<String>, List<Food>> foodGroupMap = GlazedLists.syncEventListToMultiMap(foods, new FoodGroupFunction());

        foods.add(new Food("yogurt", "dairy"));
        foodGroupMap.put("vegetables", Arrays.asList(new Food[] {new Food("broccoli", "vegetables")}));

        for (Iterator<Map.Entry<Comparable<String>, List<Food>>> i = foodGroupMap.entrySet().iterator(); i.hasNext();) {
            System.out.println(i.next());
        }
    }

    private static class FoodGroupFunction implements FunctionList.Function<Food, String> {
        public String evaluate(Food f) {
            return f.getGroup();
        }
    }
}