File Coverage

blib/lib/Parallel/Pipes/App.pm
Criterion Covered Total %
statement 77 78 98.7
branch 22 32 68.7
condition n/a
subroutine 9 9 100.0
pod 2 2 100.0
total 110 121 90.9


line stmt bran cond sub pod time code
1             package Parallel::Pipes::App v1.0.0;
2 22     22   461582 use v5.24;
  22         77  
3 22     22   132 use warnings;
  22         22  
  22         1364  
4 22     22   110 use experimental qw(lexical_subs signatures);
  22         88  
  22         132  
5              
6 22     22   9790 use Parallel::Pipes;
  22         55  
  22         23243  
7              
8 685 50   685   991 sub _min ($x, $y) { $x < $y ? $x : $y }
  685         1436  
  685         944  
  685         793  
  685         2144  
9              
10 41     41 1 183141 sub run ($class, %argv) {
  41         78  
  41         207  
  41         71  
11              
12 41 50       205 my $work = $argv{work} or die "need 'work' argument\n";
13 41 50       123 my $num = $argv{num} or die "need 'num' argument\n";
14 41 50       112 my $tasks = $argv{tasks} or die "need 'tasks' argument\n";
15 41         88 my $before_work = $argv{before_work};
16 41         88 my $after_work = $argv{after_work};
17 41         83 my $init_work = $argv{init_work};
18 41         75 my $idle_tick = $argv{idle_tick};
19 41         95 my $idle_work = $argv{idle_work};
20              
21 41 100       355 my $pipes = Parallel::Pipes->new(
22             $num,
23             $work,
24             $idle_tick ? { idle_tick => $idle_tick, idle_work => $idle_work } : (),
25             );
26 26 100       133 $init_work->($pipes) if $init_work;
27 26         2507 while (1) {
28 734         5580 my @ready = $pipes->is_ready;
29 734 100       1565 if (my @written = grep { $_->is_written } @ready) {
  876         3574  
30 685         2044 for my $written (@written) {
31 725         3338 my $result = $written->read;
32 725 50       3913 $after_work->($result, $written) if $after_work;
33             }
34             }
35 734 100       5090 if ($tasks->@*) {
36 685         3636 my $min = _min $tasks->$#*, $#ready;
37 685         2523 for my $i (0 .. $min) {
38 750         1871 my $task = shift $tasks->@*;
39 750 100       3044 $before_work->($task, $ready[$i]) if $before_work;
40 750         6171 $ready[$i]->write($task);
41             }
42             } else {
43 49 100       203 if (@ready == $num) {
44 26         104 last;
45             } else {
46 23 50       118 if (my @written = $pipes->is_written) {
47 23         78 my @ready = $pipes->is_ready(@written);
48 23         103 for my $written (@ready) {
49 25         943 my $result = $written->read;
50 25 50       94 $after_work->($result, $written) if $after_work;
51             }
52             } else {
53 0         0 die "unexpected";
54             }
55             }
56             }
57             }
58 26         172 $pipes->close;
59 26         659 1;
60             }
61              
62 22     22 1 3335937 sub map ($class, %argv) {
  22         33  
  22         110  
  22         33  
63              
64 22 50       88 my $orig_num = $argv{num} or die "need 'num' argument\n";
65 22 50       418 my $orig_tasks = $argv{tasks} or die "need 'tasks' argument\n";
66 22 50       66 my $orig_work = $argv{work} or die "need 'work' argument\n";
67              
68 22         99 my @task = map { [$_, $orig_tasks->[$_]] } 0..$orig_tasks->$#*;
  682         1122  
69 372     372   615 my $work = sub ($item) {
  372         522  
  372         554  
70 372         624 my ($index, $task) = $item->@*;
71 372         1823 my $result = $orig_work->($task);
72 372         3928580 [$index, $result];
73 22         143 };
74 22         44 my @result;
75 527     527   906 my $after_work = sub ($item, @) {
  527         821  
  527         949  
76 527         1315 my ($index, $result) = $item->@*;
77 527         2320 $result[$index] = $result;
78 22         66 };
79 22         99 $class->run(num => $orig_num, work => $work, tasks => \@task, after_work => $after_work);
80 17         419 @result;
81             }
82              
83             1;
84             __END__