every_foo for Takfile, add Tak->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;
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 351;