Future
view release on metacpan or search on metacpan
lib/Future/Utils.pm view on Meta::CPAN
returns the future it returned. The code is wrapped in an C<eval {}> block, so
that if it throws an exception this is turned into an immediate failed
C<Future>. If the code does not return a C<Future>, then an immediate failed
C<Future> instead.
(This is equivalent to using C<< Future->call >>, but is duplicated here for
completeness).
=cut
sub call(&)
{
my ( $code ) = @_;
return Future->call( $code );
}
=head2 call_with_escape
$f = call_with_escape { CODE };
I<Since version 0.22.>
lib/Future/Utils.pm view on Meta::CPAN
complex sequence of code, or immediate fail that bypasses failure handling
logic in the code itself, or several other code patterns.
$f = $code->( $escape_f );
(This can be considered similar to C<call-with-escape-continuation> as found
in some Scheme implementations).
=cut
sub call_with_escape(&)
{
my ( $code ) = @_;
my $escape_f = Future->new;
return Future->wait_any(
Future->call( $code, $escape_f ),
$escape_f,
);
}
lib/Future/Utils.pm view on Meta::CPAN
if( !$is_try and $trial->failure ) {
carp "Using Future::Utils::repeat to retry a failure is deprecated; use try_repeat instead";
}
# redo
undef $$trialp;
}
}
sub repeat(&@)
{
my $code = shift;
my %args = @_;
# This makes it easier to account for other conditions
defined($args{while}) + defined($args{until}) == 1
or defined($args{foreach})
or defined($args{generate})
or croak "Expected one of 'while', 'until', 'foreach' or 'generate'";
lib/Future/Utils.pm view on Meta::CPAN
condition code asks for it to be repeated.
In some later version the C<repeat> function will be changed so that if a
trial future fails, then the eventual future will immediately fail as well,
making its semantics a little closer to that of a C<while {}> loop in Perl.
Code that specifically wishes to catch failures in trial futures and retry
the block should use C<try_repeat> specifically.
=cut
sub try_repeat(&@)
{
# defeat prototype
&repeat( @_, try => 1 );
}
=head2 try_repeat_until_success
$future = try_repeat_until_success { CODE } ...;
I<Since version 0.18.>
A shortcut to calling C<try_repeat> with an ending condition that simply tests
for a successful result from a future. May be combined with C<foreach> or
C<generate>.
This function used to be called C<repeat_until_success>, and is currently
aliased as this name as well.
=cut
sub try_repeat_until_success(&@)
{
my $code = shift;
my %args = @_;
# TODO: maybe merge while/until conditions one day...
defined($args{while}) or defined($args{until})
and croak "Cannot pass 'while' or 'until' to try_repeat_until_success";
# defeat prototype
&try_repeat( $code, while => sub { shift->failure }, %args );
lib/Future/Utils.pm view on Meta::CPAN
C<ARRAY> references and final flattening operation used to implement this
behaviour, this function is slightly less efficient than C<fmap_scalar> or
C<fmap_void> in cases where item futures are expected only ever to return one,
or zero values, respectively.
This function is also available under the name of simply C<fmap> to emphasise
its similarity to perl's C<map> keyword.
=cut
sub fmap_concat(&@)
{
my $code = shift;
my %args = @_;
_fmap( $code, %args, collect => "array" )->then( sub {
return Future->done( map { @$_ } @_ );
});
}
*fmap = \&fmap_concat;
lib/Future/Utils.pm view on Meta::CPAN
Haskell; it expects that each item future returns only one value, and the
overall result will be a list containing these, in order of the original input
items. If an item future returns more than one value the others will be
discarded. If it returns no value, then C<undef> will be substituted in its
place so that the result list remains in correspondence with the input list.
This function is also available under the shorter name of C<fmap1>.
=cut
sub fmap_scalar(&@)
{
my $code = shift;
my %args = @_;
_fmap( $code, %args, collect => "scalar" )
}
*fmap1 = \&fmap_scalar;
=head2 fmap_void
lib/Future/Utils.pm view on Meta::CPAN
While not a map in the strictest sense, this variant is still useful as a way
to control concurrency of a function call iterating over a list of items,
obtaining its results by some other means (such as side-effects on captured
variables, or some external system).
This function is also available under the shorter name of C<fmap0>.
=cut
sub fmap_void(&@)
{
my $code = shift;
my %args = @_;
_fmap( $code, %args, collect => "void" )
}
*fmap0 = \&fmap_void;
=head1 AUTHOR
lib/Test/Future.pm view on Meta::CPAN
C<TEST> is the number of the test that failed (in case there was more than
one). A list of addresses of C<Future> instances that are still pending is
also printed to assist in debugging the issue.
It is not an error if the code does not construct any C<Future> instances at
all. The block of code may contain other testing assertions; they will be run
before the assertion by C<no_pending_futures> itself.
=cut
sub no_pending_futures(&@)
{
my ( $code, $name ) = @_;
my @futures;
no warnings 'redefine';
my $new = Future->can( "new" );
local *Future::new = sub {
my $f = $new->(@_);
t/21debug.pl view on Meta::CPAN
}
use Future;
my $FILE = __FILE__;
$FILE = qr/\Q$FILE\E/;
my $LINE;
my $LOSTLINE;
sub warnings_from(&)
{
my $code = shift;
my $warnings = "";
local $SIG{__WARN__} = sub { $warnings .= shift };
$code->();
$LOSTLINE = __LINE__; return $warnings;
}
is( warnings_from {
my $f = Future->new;
( run in 1.012 second using v1.01-cache-2.11-cpan-49f99fa48dc )