package jfxtras.icalendarfx.properties.component.recurrence.rrule.byxxx;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import jfxtras.icalendarfx.properties.component.recurrence.rrule.byxxx.ByRuleIntegerAbstract;
import jfxtras.icalendarfx.properties.component.recurrence.rrule.byxxx.BySetPosition;
public class BySetPosition extends ByRuleIntegerAbstract<BySetPosition>
{
public BySetPosition()
{
super();
}
public BySetPosition(Integer... setPositions)
{
super(setPositions);
}
public BySetPosition(BySetPosition source)
{
super(source);
}
@Override
Predicate<Integer> isValidValue()
{
return (value) -> (value >= -366) && (value <= 366) && (value != 0);
}
@Override
public Stream<Temporal> streamRecurrences(Stream<Temporal> inStream, ChronoUnit chronoUnit, Temporal startTemporal)
{
List<Temporal> inList = inStream.collect(Collectors.toList()); // can't be an infinite stream or will hang
List<Temporal> outList = new ArrayList<>();
for (int setPosition : getValue())
{
if (setPosition > 0)
{
outList.add(inList.get(setPosition-1));
} else if (setPosition < 0)
{
outList.add(inList.get(inList.size() + setPosition));
}
}
return outList.stream();
}
public static BySetPosition parse(String content)
{
return BySetPosition.parse(new BySetPosition(), content);
}
}