Future::Qをリリース

PerlFutureモジュールのサブクラスとして、Future::Qというのを作ってみた。

これはFutureモジュールにthen()メソッドといったQ.jsと(ほぼ)互換のメソッドを付け加えたもの。

こんな感じで使う。

use Future::Q;

sub async_func_future {
    my @args = @_;
    my $f = Future::Q->new;
    other_async_func(   ## This is a regular callback-style async function
        args => \@args,
        on_success => sub { $f->fulfill(@_) },
        on_failure => sub { $f->reject(@_) },
    );
    return $f;
}

async_func_future()->then(sub {
    my @results = @_;
    my @processed_values = do_some_processing(@results);
    return @processed_values;
})->then(sub {
    my @values = @_;   ## same values as @processed_values
    return async_func_future(@values);
})->then(sub {
    warn "Operation finished.\n";
})->catch(sub {
    ## failure handler
    my $error = shift;
    warn "Error: $error\n";
});

then(), catch(), try()メソッドをつけているので、最低限「Qっぽい書き方」はできると思う。

オリジナルのFutureも含め、コールバックチェーンを作れるFuture/Promise/Deferred実装のCPANモジュールは他にもあるけど、どれも微妙にQ.jsと違うんだよな。