class Async::Barrier
def wait
@returns [Integer | Nil] The number of tasks which were waited for, or `nil` if there were no tasks to wait for.
@yields {|task| ...} If a block is given, the unwaited task is yielded. You must invoke {Task#wait} yourself. In addition, you may `break` if you have captured enough results.
Wait for all tasks to complete by invoking {Task#wait} on each waiting task, which may raise an error. As long as the task has completed, it will be removed from the barrier.
def wait return nil if @tasks.empty? count = 0 while true # Wait for a task to finish (we get the task node): break unless waiting = @finished.wait count += 1 # Remove the task as it is now finishing: @tasks.remove?(waiting) # Get the task: task = waiting.task # If a block is given, the user can implement their own behaviour: if block_given? yield task else # Wait for it to either complete or raise an error: task.wait end break if @tasks.empty? end return count end