—package
List::MapBruteBatch;
BEGIN {
$List::MapBruteBatch::VERSION
=
'0.02'
; }
use
strict;
use
warnings;
our
@EXPORT_OK
=
'map_brute_batch'
;
sub
map_brute_batch {
my
(
$cb
,
$items
,
$cb_success
,
$cb_failure
) =
@_
;
if
(
$cb
->(
$items
)) {
return
$cb_success
->(
$items
)
if
$cb_success
;
return
;
}
elsif
(
@$items
> 1) {
my
$i
=
@$items
;
my
@a
=
@$items
[0 .. (
$i
/ 2)-1];
my
@b
=
@$items
[
$i
/ 2 .. (
$i
- 1)];
return
(
map_brute_batch(
$cb
, \
@a
,
$cb_success
,
$cb_failure
),
map_brute_batch(
$cb
, \
@b
,
$cb_success
,
$cb_failure
),
);
}
else
{
return
$cb_failure
->(
$items
)
if
$cb_failure
;
return
;
}
}
1;
__END__
=encoding utf8
=head1 NAME
List::MapBruteBatch - Do a brute-force batched C<map()> though a list with a callback
=head1 SYNOPSIS
map_brute_batch($cb, \@list);
my @ret = map_brute_batch($cb, \@list, \$cb_success, \$cb_failure);
=head1 DESCRIPTION
Firstly. Why would you use this?
You have some C<N> number of items you want to process. You have some
function that can take those C<N>, and it's much cheaper to do them in
one big batch than one at a time.
However, any one of the C<N> items can fail, causing the entire batch
of C<N> to fail with it. When that happens you either don't know which
one failed the batch, or finding out would be tedious.
This module provides a C<map()>-like function to solve that
problem. It'll attempt to process a C<\@list> you provide with a
C<$cb> function that you provide.
If your C<$cb> doesn't return true we bisect the C<\@list> and call
your C<$cb> on each half of the bisected list, and if those fail we
repeat this process until we're processing one item, which may also
fail.
You can optionally provide C<$cb_success> or C<$cb_failure> callbacks,
those'll be called in C<map()>-like fashion on items that fail or
succeed, respectively. You can use this to make the function return a
list of items showing which items ended up failing or succeeding.
=head1 AUTHOR
Ævar Arnfjörð Bjarmason <avar@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2013-2016 by Ævar Arnfjörð Bjarmason
<avar@cpan.org>
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut