ProjectAres/PGM/src/main/java/tc/oc/pgm/countdowns/SingleCountdownContext.java

80 lines
2.3 KiB
Java

package tc.oc.pgm.countdowns;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import java.time.Duration;
public class SingleCountdownContext extends CountdownContext {
private @Nullable Runner runner;
@Override
protected Stream<Runner> runners() {
return runner != null ? Stream.of(runner)
: Stream.of();
}
@Override
protected Optional<Runner> runner(Countdown countdown) {
return runner != null && runner.countdown.equals(countdown) ? Optional.of(runner)
: Optional.empty();
}
@Override
protected void addRunner(Runner runner) {
if(this.runner != null) {
this.runner.cancel(false);
}
this.runner = runner;
}
@Override
protected void removeRunner(Runner runner) {
if(runner.equals(this.runner)) {
this.runner = null;
}
}
@Override
public Set<Countdown> getAll() {
return runner != null ? Collections.singleton(runner.countdown)
: Collections.emptySet();
}
public @Nullable Countdown getCountdown() {
return runner != null ? runner.countdown
: null;
}
public @Nullable <T extends Countdown> T getCountdown(Class<T> type) {
return runner != null && type.isInstance(runner.countdown) ? (T) runner.countdown
: null;
}
protected Optional<Runner> runner() {
return Optional.ofNullable(runner);
}
public Optional<Countdown> countdown() {
return runner().map(Runner::countdown);
}
public <T extends Countdown> Optional<T> countdown(Class<T> type) {
return runner().filter(r -> type.isInstance(r.countdown()))
.map(r -> (T) r.countdown());
}
public Optional<Duration> remaining() {
return runner().map(Runner::remaining);
}
public Optional<Duration> remaining(Class<? extends Countdown> type) {
return runner().filter(r -> type.isInstance(r.countdown()))
.map(Runner::remaining);
}
}