package com.codepoetics.protonpack.selectors; import java.util.Comparator; import java.util.stream.Stream; public final class Selectors { private Selectors() { } public static <T> Selector<T> roundRobin() { return new Selector<T>() { private int startIndex = 0; @Override public Integer apply(T[] options) { int result = startIndex; while (options[result] == null) { result = (result + 1) % options.length; } startIndex = (result + 1) % options.length; return result; } }; } public static <T extends Comparable<T>> Selector<T> takeMin() { return takeMin(Comparator.naturalOrder()); } public static <T> Selector<T> takeMin(Comparator<? super T> comparator) { return new Selector<T>() { private int startIndex = 0; @Override public Integer apply(T[] options) { T smallest = Stream.of(options).filter(t -> t != null).min(comparator).get(); int result = startIndex; while (options[result] == null || comparator.compare(smallest, options[result]) != 0) { result = (result + 1) % options.length; } startIndex = (result + 1) % options.length; return result; } }; } public static <T extends Comparable<T>> Selector<T> takeMax() { return takeMax(Comparator.naturalOrder()); } public static <T> Selector<T> takeMax(Comparator<? super T> comparator) { return takeMin(comparator.reversed()); } }