public class Loop<T> extends CoroutineStep<T,T>
Coroutine
step that loops over another step (which may be a
subroutine) as long as a predicate yields TRUE for the input value and/or the
current continuation. The looped step get's the loop input value as it's
input on the first iteration and must return a value of the same type which
will then be used to test the condition before the next loop run.
If more complex conditions need to be checked the loop condition can check
relations that have been set in the Continuation
by the looped
step.
Constructor and Description |
---|
Loop(java.util.function.BiPredicate<? super T,Continuation<?>> fCondition,
CoroutineStep<T,T> rLoopedStep)
Creates a new instance.
|
Modifier and Type | Method and Description |
---|---|
protected T |
execute(T rValue,
Continuation<?> rContinuation)
This method must be implemented by subclasses to provide the actual
functionality of this step.
|
static <T> Loop<T> |
loopWhile(java.util.function.BiPredicate<? super T,Continuation<?>> pCondition,
CoroutineStep<T,T> rLoopedStep)
Repeatedly executes a certain step as long as the given condition is TRUE
for the current value and the continuation of the execution.
|
static <T> Loop<T> |
loopWhile(java.util.function.Predicate<T> pCondition,
CoroutineStep<T,T> rLoopedStep)
Repeatedly executes a certain step as long as the given condition is TRUE
for the current value.
|
void |
runAsync(java.util.concurrent.CompletableFuture<T> fPreviousExecution,
CoroutineStep<T,?> rNextStep,
Continuation<?> rContinuation)
Runs this execution step asynchronously as a continuation of a previous
code execution in a
CompletableFuture and proceeds to the next
step afterwards. |
fail, runBlocking, terminateCoroutine, toString
deleteRelation, get, getRelation, getRelations, notifyRelationListeners, readRelations, relationsEqual, relationsHashCode, relationsString, set, set, transform, writeRelations
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
public Loop(java.util.function.BiPredicate<? super T,Continuation<?>> fCondition, CoroutineStep<T,T> rLoopedStep)
fCondition
- The condition to check for TRUE to continue loopingrLoopedStep
- The step to execute in the looppublic static <T> Loop<T> loopWhile(java.util.function.BiPredicate<? super T,Continuation<?>> pCondition, CoroutineStep<T,T> rLoopedStep)
pCondition
- The condition to check for TRUE to continue loopingrLoopedStep
- The step to execute in the looppublic static <T> Loop<T> loopWhile(java.util.function.Predicate<T> pCondition, CoroutineStep<T,T> rLoopedStep)
If more complex conditions need to be checked the method loopWhile(BiPredicate, CoroutineStep)
can be used to check relations
that have been set in the Continuation
by the looped step.
pCondition
- The condition to check for TRUE to continue loopingrLoopedStep
- The step to execute in the looppublic void runAsync(java.util.concurrent.CompletableFuture<T> fPreviousExecution, CoroutineStep<T,?> rNextStep, Continuation<?> rContinuation)
CompletableFuture
and proceeds to the next
step afterwards.
Subclasses that need to suspend the invocation of the next step until
some condition is met (e.g. sending or receiving data has finished) need
to override this method and create a Suspension
by invoking
Continuation.suspend(CoroutineStep, CoroutineStep)
on the next
step. If the condition that caused the suspension resolves the coroutine
execution can be resumed by calling Suspension.resume(Object)
.
Subclasses that override this method also need to handle errors by
terminating any further execution (i.e. not resuming a suspension if such
exists) and forwarding the causing exception to Continuation.fail(Throwable)
.
runAsync
in class CoroutineStep<T,T>
fPreviousExecution
- The future of the previous code executionrNextStep
- The next step to execute or NULL for nonerContinuation
- The continuation of the executionprotected T execute(T rValue, Continuation<?> rContinuation)
execute
in class CoroutineStep<T,T>
rValue
- The input valuerContinuation
- The continuation of the execution