1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.util.collections;
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.Collection;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.LinkedList;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
112637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin/**
122637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * Basic list/collection operators.
132637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * We know that there are existing libraries that implement those use cases neatly.
142637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * However, we want to keep Mockito dependencies minimal.
152637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin * In Java8 we should be able to get rid of this class.
162637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin */
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class ListUtil {
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public static <T> LinkedList<T> filter(Collection<T> collection, Filter<T> filter) {
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        LinkedList<T> filtered = new LinkedList<T>();
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        for (T t : collection) {
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            if (!filter.isOut(t)) {
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                filtered.add(t);
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            }
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return filtered;
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
282637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
292637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public static <From, To> LinkedList<To> convert(Collection<From> collection, Converter<From, To> converter) {
302637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        LinkedList<To> converted = new LinkedList<To>();
312637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        for (From f: collection) {
322637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin            converted.add(converter.convert(f));
332637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        }
342637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        return converted;
352637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
362637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
37e03a0f42b85425bffd40bcf790819671a7848c1aPaul Duffin    public interface Filter<T> {
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        boolean isOut(T object);
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
402637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin
412637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    public interface Converter<From, To> {
422637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin        To convert(From from);
432637d96c202372854a7c71466ddcc6e90fc4fc53Paul Duffin    }
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}
45