A parallel scope completes whoever accounts for its last iteration - #136
Merged
Merged
Conversation
The loop is over once every iteration is accounted for - arrived at the scope join, filtered by a condition, or taken back (#atEnd). Only the scope join's own step used to close the scope; a withdrawal, a filtered last iteration or an empty input popped the executor and left the flow behind the loop unrun while the instance read #done. FBParallelExecutor>>completeScope is now the one way the scope closes: from the join's step, from #continue after a withdrawal or a filtered iteration, and from the fork's behavior for an empty input. The scope join's activation carries one value per iteration - nil where none arrived - and goes on behind the join on a token of the fork's strand, in the fork's scope. The loop completes with nothing as well: an empty input, every iteration filtered or every iteration taken back leave the flow behind the loop to go on with an empty result - the loop is one activity of the flow, not a join of independent strands. A body whose every path ends at an end event has no join to go on from; the scope closes and the fork's strand is over, as before. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The loop is over once every iteration is accounted for - arrived at the scope join, filtered by a condition, or taken back (#atEnd). Only the scope join's own step used to close the scope; a withdrawal, a filtered last iteration or an empty input popped the executor and left the flow behind the loop unrun while the instance read #done.
FBParallelExecutor>>completeScope is now the one way the scope closes: from the join's step, from #continue after a withdrawal or a filtered iteration, and from the fork's behavior for an empty input. The scope join's activation carries one value per iteration - nil where none arrived - and goes on behind the join on a token of the fork's strand, in the fork's scope. The loop completes with nothing as well: an empty input, every iteration filtered or every iteration taken back leave the flow behind the loop to go on with an empty result - the loop is one activity of the flow, not a join of independent strands. A body whose every path ends at an end event has no join to go on from; the scope closes and the fork's strand is over, as before.