NAME

Async::Util - Utilities for common asynchronous programming tasks

SYNOPSIS

use Async::Util qw(amap azipmap achain);

# async map
amap(
    inputs => [ 'foo', 'bar' ],
    action => \&something_asynchronous,
    cb     => \&do_this_at_the_end,
);

# invoke action on the corresponding input
azipmap(
    inputs  => [ 1, 1, 1 ],
    actions => [
        ... # asynchronous subs
    ],
    cb     => \&do_this_at_the_end,
);

# execute steps in order
achain(
    input => 2,
    steps => [
        ... # asynchronous subs
    ],
    cb    => \&do_this_at_the_end,
);

Examples using AnyEvent:

use AnyEvent;
use Async::Util qw(amap);

my @timers;
my $delayed_double = sub {
    my ($input, $cb) = @_;

    push @timers, AnyEvent->timer(after => 2, cb => sub {
        $cb->($input*2);
    });
};

my $cv = AE::cv;

amap(
    inputs    => [ 1 .. 20 ],
    action    => $delayed_double,
    cb        => sub { $cv->send(@_) },
    at_a_time => 5,
);

my ($res, $err) = $cv->recv;

# achain
my $cv = AE::cv;

achain(
    input => 2,
    steps => [
        sub {
            my ($input, $cb) = @_;
            push @timers, AnyEvent->timer(
                after => 0,
                cb    => sub { $cb->($input+1) },
            );
        },
        sub {
            my ($input, $cb) = @_;
            push @timers, AnyEvent->timer(
                after => 0,
                cb    => sub { $cb->($input * 2) },
            );
        },
    ],
    cb => sub { $cv->send(@_) },
);

my ($res, $err) = $cv->recv; # $res is 6

DESCRIPTION

Async::Util provides functionality for common tasks that come up when doing asynchronous programming. This module's functions often take code refs. These code refs are invoked with two arguments: the input and a callback to be invoked on completion. When the provided callback is invoked it should be passed an output argument and an optional error.

FUNCTIONS

amap

amap is an asynchronous version of map:

amap(
    inputs    => <ARRAY_REF>,
    action    => <CODE_REF>,
    cb        => <CODE_REF>,
    at_a_time => <INTEGER>, # defaults to 100
    output    => <BOOL>,    # defaults to true
);

The action coderef is executed for every provided input. The first argument to the action coderef is an input from the list and the second is a callback. When the action is done it should invoke the callback passing the result as the first argument and optionally an error message as the second.

If the action will produce no output then it can pass undef as the first argument to the callback and an optional error as the second argument in the usual way. In this case, the amap argument output can be set to 0, allowing certain performance optimizations to occur.

The at_a_time argument sets the maximum number of inputs that will be processed simultaneously. This defaults to 100.

When the action has been applied to each input then the cb coderef is invoked and passed an arrayref containing one result for every input. If action ever passes an error to its callback then the cb coderef is immediately invoked and passed the error. No more inputs are processed.

azipmap

azipmap executes a list of callbacks on a list of corresponding inputs. Every provided action is executed and passed the input found in the same position in the list of provided inputs. In other words, the list of actions and the list of inputs are zipped in to action/input pairs, then each action is executed on its input.

azipmap(
    inputs    => <ARRAY_REF>,
    actions   => <CODE_REF>,
    cb        => <CODE_REF>,
    at_a_time => <INTEGER>, # defaults to 100
    output    => <BOOL>,    # defaults to true
);

Just as with amap, actions should pass a result to the passed in callback as well as an optional error. Also, as with amap, the cb coderef is invoked once all the inputs have been processed or immediately if any action passes an error to its callback.

achain

achain executes the provided steps in order. Each step's coderef is passed an input and a callback. When the step is complete is should invoke the coderef and pass a result and an optional error. The result from each step becomes the input to the next step. The first step's input is the value passed to achain as the input argument. When all steps are complete the cb coderef is executed and passed the result from the last step. If any step returns an error then the cb coderef is immediately invoked and passed the error.

achain(
    input => <SCALAR>,
    steps => <ARRAY_REF>,
    cb    => <CODE_REF>,
);

REPOSITORY

http://github.com/wjackson/async-util

AUTHORS

Whitney Jackson