sub fibonacci {
my ($n) = @_;
return 0 if $n == 0;
return 1 if $n == 1;
return sum fibonacci($n-2), fibonacci($n-1);
}
####
sub fibonacci {
my ($n) = @_;
return 0 if $n == 0;
return 1 if $n == 1;
return sum map $_->join(),
async { fibonacci($n-2) },
async { fibonacci($n-1) };
}
####
sub fibonacci {
my ($n) = @_;
return 0 if $n == 0;
return 1 if $n == 1;
return sum map $_->get(),
async_maybe { fibonacci($n-2) },
async_maybe { fibonacci($n-1) };
}
####
sub fibonacci {
my ($n) = @_;
my $result;
process_and_wait(sub {
fibonacci_task(sub { $result = $_[0]; }, $n );
});
return $result;
}
sub fibonacci_task {
my ($on_complete, $n) = @_;
return $on_complete->(0) if $n == 0;
return $on_complete->(1) if $n == 1;
my ($x,$y);
process(sub { fibonacci_task(sub { $x = $_[0] }, $n-2) });
process(sub { fibonacci_task(sub { $y = $_[0] }, $n-1) });
#TODO: The last of the two tasks to complete
# must call $on_complete->($x+$y).
}