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