every_foo for Takfile, add Tak->await_all
[scpubgit/Tak.git] / lib / Tak.pm
index 33bc378..1e0de48 100644 (file)
@@ -14,4 +14,22 @@ 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 %orig;
+  my %on_r = map {
+    my $orig = $orig{$_} = $_->{on_result};
+    my $tag = $req{$_};
+    ($_ => sub { delete $req{$tag}; $orig->(@_); $done = 1 unless keys %req; })
+  } @requests;
+  $_->{on_result} = $on_r{$_} for @requests;
+  $class->loop_until($done);
+  $_->{on_result} = $orig{$_} for @requests;
+  return;
+}
+
 1;