File Coverage

blib/lib/Cassandra/Client/Util.pm
Criterion Covered Total %
statement 36 47 76.6
branch 6 12 50.0
condition 2 6 33.3
subroutine 9 11 81.8
pod 0 3 0.0
total 53 79 67.0


line stmt bran cond sub pod time code
1             package Cassandra::Client::Util;
2             our $AUTHORITY = 'cpan:TVDW';
3             $Cassandra::Client::Util::VERSION = '0.21';
4 14     14   173255 use 5.010;
  14         52  
5 14     14   85 use strict;
  14         29  
  14         416  
6 14     14   61 use warnings;
  14         48  
  14         1034  
7              
8 14     14   122 use Exporter 'import';
  14         53  
  14         1152  
9             our @EXPORT= ('series', 'parallel', 'whilst');
10              
11 14     14   7927 use Sub::Current;
  14         6217  
  14         86  
12              
13             sub series {
14 1     1 0 678 my $list= shift;
15 1         2 my $final= shift;
16              
17             (shift @$list)->(sub {
18 3     3   13 my $next= shift @$list;
19 3 100 66     16 if ($next && !$_[0]) {
20 2         10 splice @_, 0, 1, ROUTINE();
21 2         8 goto &$next;
22             }
23              
24 1         3 goto &$final;
25 1         9 });
26              
27 1         13 return;
28             }
29              
30             sub parallel {
31 1     1 0 250526 my ($list, $final)= @_;
32              
33 1 50       6 if (!@$list) {
34 0         0 return $final->();
35             }
36              
37 1         3 my $remaining= 0+@$list;
38 1         2 my @result;
39 1         5 for my $i (0..$#$list) {
40             $list->[$i]->(sub {
41 3     3   19 my ($error, $result)= @_;
42 3 50       9 if ($error) {
43 0 0       0 if ($remaining > 0) {
44 0         0 $remaining= 0;
45 0         0 $final->($error);
46             }
47 0         0 return;
48             }
49              
50 3         7 $result[$i]= $result;
51              
52 3         24 $remaining--;
53 3 100       18 if ($remaining == 0) {
54 1         5 $final->(undef, @result);
55             }
56 3         18 });
57             }
58              
59 1         14 return;
60             }
61              
62             sub whilst {
63 0     0 0   my ($condition, $iteratee, $callback)= @_;
64              
65             (sub {
66 0 0 0 0     if (defined $_[0] || !($condition->())) {
67 0           goto &$callback;
68             }
69 0           splice @_, 0, 1, ROUTINE();
70 0           goto &$iteratee;
71 0           })->();
72             }
73              
74             1;
75              
76             __END__