[commands] Add onlyWhile and onlyIf (#5291)

This commit is contained in:
Joseph Eng
2023-04-30 14:09:02 -07:00
committed by GitHub
parent 40ca094686
commit ee3b4621e5
7 changed files with 183 additions and 3 deletions

View File

@@ -82,9 +82,7 @@ public interface Command {
/**
* Decorates this command with an interrupt condition. If the specified condition becomes true
* before the command finishes normally, the command will be interrupted and un-scheduled. Note
* that this only applies to the command returned by this method; the calling command is not
* itself changed.
* before the command finishes normally, the command will be interrupted and un-scheduled.
*
* <p>Note: This decorator works by adding this command to a composition. The command the
* decorator was called on cannot be scheduled independently or be added to a different
@@ -94,11 +92,30 @@ public interface Command {
*
* @param condition the interrupt condition
* @return the command with the interrupt condition added
* @see #onlyWhile(BooleanSupplier)
*/
default ParallelRaceGroup until(BooleanSupplier condition) {
return raceWith(new WaitUntilCommand(condition));
}
/**
* Decorates this command with a run condition. If the specified condition becomes false before
* the command finishes normally, the command will be interrupted and un-scheduled.
*
* <p>Note: This decorator works by adding this command to a composition. The command the
* decorator was called on cannot be scheduled independently or be added to a different
* composition (namely, decorators), unless it is manually cleared from the list of composed
* commands with {@link CommandScheduler#removeComposedCommand(Command)}. The command composition
* returned from this method can be further decorated without issue.
*
* @param condition the interrupt condition
* @return the command with the interrupt condition added
* @see #until(BooleanSupplier)
*/
default ParallelRaceGroup onlyWhile(BooleanSupplier condition) {
return until(() -> !condition.getAsBoolean());
}
/**
* Decorates this command with an interrupt condition. If the specified condition becomes true
* before the command finishes normally, the command will be interrupted and un-scheduled. Note
@@ -301,13 +318,39 @@ public interface Command {
* running and the condition changes to true, the command will not stop running. The requirements
* of this command will be kept for the new conditional command.
*
* <p>Note: This decorator works by adding this command to a composition. The command the
* decorator was called on cannot be scheduled independently or be added to a different
* composition (namely, decorators), unless it is manually cleared from the list of composed
* commands with {@link CommandScheduler#removeComposedCommand(Command)}. The command composition
* returned from this method can be further decorated without issue.
*
* @param condition the condition that will prevent the command from running
* @return the decorated command
* @see #onlyIf(BooleanSupplier)
*/
default ConditionalCommand unless(BooleanSupplier condition) {
return new ConditionalCommand(new InstantCommand(), this, condition);
}
/**
* Decorates this command to only run if this condition is met. If the command is already running
* and the condition changes to false, the command will not stop running. The requirements of this
* command will be kept for the new conditional command.
*
* <p>Note: This decorator works by adding this command to a composition. The command the
* decorator was called on cannot be scheduled independently or be added to a different
* composition (namely, decorators), unless it is manually cleared from the list of composed
* commands with {@link CommandScheduler#removeComposedCommand(Command)}. The command composition
* returned from this method can be further decorated without issue.
*
* @param condition the condition that will allow the command to run
* @return the decorated command
* @see #unless(BooleanSupplier)
*/
default ConditionalCommand onlyIf(BooleanSupplier condition) {
return unless(() -> !condition.getAsBoolean());
}
/**
* Decorates this command to run or stop when disabled.
*