switch to local-izing on_result in await_all
[scpubgit/Tak.git] / lib / Tak.pm
index 33bc378..dfa1930 100644 (file)
@@ -14,4 +14,25 @@ sub loop_until {
   $loop->loop_once until $_[1];
 }
 
+sub await_all {
+  my ($class, @requests) = @_;
+  @requests = grep !$_->is_done, @requests;
+  return unless @requests;
+  my %req = map +("$_" => "$_"), @requests;
+  my $done;
+  my %on_r = map {
+    my $orig = $_->{on_result};
+    my $tag = $req{$_};
+    ($_ => sub { delete $req{$tag}; $orig->(@_); $done = 1 unless keys %req; })
+  } @requests;
+  my $call = sub { $class->loop_until($done) };
+  foreach (@requests) {
+    my $req = $_;
+    my $inner = $call;
+    $call = sub { local $req->{on_result} = $on_r{$req}; $inner->() };
+  }
+  $call->();
+  return;
+}
+
 1;