// Copyright © 2015 HSL <https://www.hsl.fi> // This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses. package fi.hsl.parkandride.core.domain.prediction; import com.mysema.commons.lang.CloseableIterator; import com.mysema.commons.lang.IteratorAdapter; import fi.hsl.parkandride.core.domain.Utilization; import org.joda.time.DateTime; import org.joda.time.DateTimeComparator; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.function.BinaryOperator; import java.util.stream.Collectors; public class UtilizationHistoryList implements UtilizationHistory { private final List<Utilization> utilizationList; public UtilizationHistoryList(List<Utilization> utilizationList) { if (utilizationList == null || utilizationList.size() == 0) throw new IllegalArgumentException("utilizationList must not be null or empty."); this.utilizationList = utilizationList; } @Override public Optional<Utilization> getLatest() { return Optional.of(utilizationList.stream() .reduce(utilizationList.get(0), BinaryOperator.maxBy((a, b) -> a.timestamp.compareTo(b.timestamp)))); } @Override public List<Utilization> getRange(DateTime startInclusive, DateTime endInclusive) { return utilizationList.stream() .filter(utilization -> !utilization.timestamp.isBefore(startInclusive) && !utilization.timestamp.isAfter(endInclusive)) .collect(Collectors.toList()); } @Override public CloseableIterator<Utilization> getUpdatesSince(DateTime startExclusive) { return new IteratorAdapter<Utilization>( utilizationList.stream() .filter(utilization -> !utilization.timestamp.isBefore(startExclusive)) .iterator() ); } @Override public Optional<Utilization> getAt(DateTime timestamp) { return utilizationList.stream() .filter(Objects::nonNull) .filter(u -> !u.timestamp.isAfter(timestamp)) .max((u1, u2) -> u1.timestamp.compareTo(u2.timestamp)); } }