Commit | Line | Data |
31a246e4 |
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 | |
934a93db |
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; |
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 |
38 | 1; |