package com.kickstarter.libs.utils; import android.support.annotation.NonNull; import com.kickstarter.libs.Range; import java.util.ArrayList; import java.util.List; public final class RangeUtils { private RangeUtils() {} /** * Given a list of integers computes a list of consecutive, monotonically non-descreasing ranges. */ public static @NonNull List<Range> consecutiveRanges(final @NonNull List<Integer> xs) { final List<Range> result = new ArrayList<>(); for (int idx = 0; idx < xs.size(); idx++) { final Integer previous; final Integer current; if (idx == 0) { previous = null; current = xs.get(idx); } else { previous = xs.get(idx - 1); current = xs.get(idx); } if (previous == null) { result.add(Range.create(0, 1)); } else if (current == previous + 1 || current.equals(previous)) { final int lastIdx = result.size() - 1; final Range lastRange = result.get(lastIdx); result.set(lastIdx, Range.create(lastRange.start, lastRange.length + 1)); } else { result.add(Range.create(idx, 1)); } } return result; } public static @NonNull List<Range> positionalRanges(final @NonNull List<Integer> positions) { final Integer firstPosition; if (positions.size() == 0) { return new ArrayList<>(); } firstPosition = positions.get(0); final List<Range> ranges = RangeUtils.consecutiveRanges(positions); final List<Range> result = new ArrayList<>(); for (final Range range : ranges) { result.add(Range.create(range.start + firstPosition, range.length)); } return result; } }