1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
use Future;
use Future::Utils qw( fmap_concat fmap_scalar );
# fmap_concat no concurrency
{
my @subf;
my $future = fmap_concat {
return $subf[$_[0]] = Future->new
} foreach => [ 0 .. 2 ];
my @results;
$future->on_done( sub { @results = @_ });
$subf[0]->done( "A", "B" );
$subf[1]->done( "C", "D", );
$subf[2]->done( "E" );
ok( $future->is_ready, '$future now ready after subs done for fmap_concat' );
is_deeply( [ $future->get ], [qw( A B C D E )], '$future->get for fmap_concat' );
is_deeply( \@results, [qw( A B C D E )], '@results for fmap_concat' );
}
# fmap_concat concurrent
{
my @subf;
my $future = fmap_concat {
return $subf[$_[0]] = Future->new
} foreach => [ 0 .. 2 ],
concurrent => 3;
# complete out of order
$subf[0]->done( "A", "B" );
$subf[2]->done( "E" );
$subf[1]->done( "C", "D" );
is_deeply( [ $future->get ], [qw( A B C D E )], '$future->get for fmap_concat out of order' );
}
# fmap_scalar no concurrency
{
my @subf;
my $future = fmap_scalar {
return $subf[$_[0]] = Future->new
} foreach => [ 0 .. 2 ];
my @results;
$future->on_done( sub { @results = @_ });
$subf[0]->done( "A" );
$subf[1]->done( "B" );
$subf[2]->done( "C" );
ok( $future->is_ready, '$future now ready after subs done for fmap_scalar' );
is_deeply( [ $future->get ], [qw( A B C )], '$future->get for fmap_scalar' );
is_deeply( \@results, [qw( A B C )], '@results for fmap_scalar' );
}
done_testing;
|