PriorizedList.java
package fr.sii.ogham.core.util;
import static java.util.stream.Collectors.toList;
import java.util.ArrayList;
import java.util.List;
/**
* Helper class that registers objects with associated priority. Each registered
* object is then returned as list ordered by priority. The higher priority
* value comes first in the list.
*
* @author Aurélien Baudet
*
* @param <P>
* the type of priorized objects
*/
public class PriorizedList<P> {
private final List<WithPriority<P>> priorities;
/**
* Initializes with an empty list
*/
public PriorizedList() {
this(new ArrayList<>());
}
/**
* Initializes with some priorized objects
*
* @param priorities
* the priorized objects
*/
public PriorizedList(List<WithPriority<P>> priorities) {
super();
this.priorities = priorities;
}
/**
* Registers a new priorized object
*
* @param priorized
* the wrapped object with its priority
* @return this instance for fluent chaining
*/
public PriorizedList<P> register(WithPriority<P> priorized) {
priorities.add(priorized);
return this;
}
/**
* Registers an object with its priority
*
* @param priorized
* the object to register
* @param priority
* the associated priority
* @return this instance for fluent chaining
*/
public PriorizedList<P> register(P priorized, int priority) {
priorities.add(new WithPriority<>(priorized, priority));
return this;
}
/**
* Merge all priorities of another {@link PriorizedList} into this one.
*
* @param other
* the priority list
* @return this isntance for fluent chaining
*/
public PriorizedList<P> register(PriorizedList<P> other) {
priorities.addAll(other.getPriorities());
return this;
}
/**
* Returns true if this list contains no elements.
*
* @return if this list contains no elements
*/
public boolean isEmpty() {
return priorities.isEmpty();
}
/**
* Get the list of priorities ordered by priority
*
* @return ordered list of priorities
*/
public List<WithPriority<P>> getPriorities() {
return sort();
}
/**
* Get the list of priorized objects ordered by highest priority.
*
* @return list of objects ordered by highet priority
*/
public List<P> getOrdered() {
return sort().stream().map(WithPriority::getPriorized).collect(toList());
}
private List<WithPriority<P>> sort() {
priorities.sort(WithPriority.comparator());
return priorities;
}
}