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; |
23 | my %orig; |
24 | my %on_r = map { |
25 | my $orig = $orig{$_} = $_->{on_result}; |
26 | my $tag = $req{$_}; |
27 | ($_ => sub { delete $req{$tag}; $orig->(@_); $done = 1 unless keys %req; }) |
28 | } @requests; |
29 | $_->{on_result} = $on_r{$_} for @requests; |
30 | $class->loop_until($done); |
31 | $_->{on_result} = $orig{$_} for @requests; |
32 | return; |
33 | } |
34 | |
31a246e4 |
35 | 1; |