1e0de481de45e31445b1ef5a7c0ccc5317873c55
[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 %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
35 1;