switch to local-izing on_result in await_all
[scpubgit/Tak.git] / lib / Tak.pm
1 package Tak;
2
3 use Tak::Loop;
4 use strictures 1;
5
6 our $loop;
7
8 sub loop { $loop ||= Tak::Loop->new }
9
10 sub loop_until {
11   my ($class, $done) = @_;
12   return if $done;
13   my $loop = $class->loop;
14   $loop->loop_once until $_[1];
15 }
16
17 sub await_all {
18   my ($class, @requests) = @_;
19   @requests = grep !$_->is_done, @requests;
20   return unless @requests;
21   my %req = map +("$_" => "$_"), @requests;
22   my $done;
23   my %on_r = map {
24     my $orig = $_->{on_result};
25     my $tag = $req{$_};
26     ($_ => sub { delete $req{$tag}; $orig->(@_); $done = 1 unless keys %req; })
27   } @requests;
28   my $call = sub { $class->loop_until($done) };
29   foreach (@requests) {
30     my $req = $_;
31     my $inner = $call;
32     $call = sub { local $req->{on_result} = $on_r{$req}; $inner->() };
33   }
34   $call->();
35   return;
36 }
37
38 1;