@Override
public LocalDateDoubleTimeSeries subSeries(LocalDate startInclusive, LocalDate endExclusive) {
ArgChecker.notNull(startInclusive, "startInclusive");
ArgChecker.notNull(endExclusive, "endExclusive");
if (endExclusive.isBefore(startInclusive)) {
throw new IllegalArgumentException(
"Invalid sub series, end before start: " + startInclusive + " to " + endExclusive);
}
if (isEmpty() || startInclusive.equals(endExclusive) ||
!startDate.isBefore(endExclusive) ||
startInclusive.isAfter(getLatestDate())) {
return LocalDateDoubleTimeSeries.empty();
}
LocalDate resolvedStart = dateCalculation.adjustDate(Ordering.natural().max(startInclusive, startDate));
int startIndex = dateCalculation.calculatePosition(startDate, resolvedStart);
int endIndex = dateCalculation.calculatePosition(startDate, endExclusive);
return new DenseLocalDateDoubleTimeSeries(
resolvedStart,
Arrays.copyOfRange(points, Math.max(0, startIndex), Math.min(points.length, endIndex)),
dateCalculation,
true);
}