package io.sphere.sdk.facets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Mapper that sorts the options according to the given list of values.
* Any value that do not appear in the list of values is placed at the end of the output list.
*/
public class SortedFacetOptionMapper implements FacetOptionMapper {
private final List<String> sortedFacetValues;
private SortedFacetOptionMapper(final List<String> sortedFacetValues) {
this.sortedFacetValues = sortedFacetValues;
}
@Override
public List<FacetOption> apply(final List<FacetOption> facetOptions) {
final List<FacetOption> sortedFacetOptions = new ArrayList<>(facetOptions);
Collections.sort(sortedFacetOptions, this::comparePositions);
return sortedFacetOptions;
}
public static SortedFacetOptionMapper of(final List<String> sortedFacetValues) {
return new SortedFacetOptionMapper(sortedFacetValues);
}
private int comparePositions(final FacetOption left, final FacetOption right) {
final int leftPosition = sortedFacetValues.indexOf(left.getValue());
final int rightPosition = sortedFacetValues.indexOf(right.getValue());
return comparePositions(leftPosition, rightPosition);
}
static int comparePositions(final int leftPosition, final int rightPosition) {
final int comparison;
if (leftPosition == rightPosition) {
comparison = 0;
} else if (leftPosition < 0) {
comparison = 1;
} else if (rightPosition < 0) {
comparison = -1;
} else {
comparison = Integer.compare(leftPosition, rightPosition);
}
return comparison;
}
}