Data-Monad-CondVar

 view release on metacpan or  search on metacpan

lib/Data/Monad/CondVar.pm  view on Meta::CPAN


our $VERSION = "0.06";
our @EXPORT = qw/as_cv cv_unit cv_zero cv_fail cv_flat_map_multi cv_map_multi
                 cv_sequence call_cc/;

sub _assert_cv($) {
    $_[0]->ready and die "[BUG]It already has been ready";
    $_[0];
}

sub as_cv(&) {
    my $code = shift;
    $code->(my $cv = AE::cv);
    $cv;
}

sub cv_unit { AnyEvent::CondVar->unit(@_) }
sub cv_zero { AnyEvent::CondVar->zero(@_) }
sub cv_fail { AnyEvent::CondVar->fail(@_) }
sub cv_flat_map_multi(&@) { AnyEvent::CondVar->flat_map_multi(@_) }
sub cv_map_multi(&@) { AnyEvent::CondVar->map_multi(@_) }
sub cv_sequence { AnyEvent::CondVar->sequence(@_) }

sub call_cc(&) {
    my $f = shift;
    my $ret_cv = AE::cv;

    my $skip = sub {
        my @v = @_;
        _assert_cv $ret_cv;
        $ret_cv->send(@v);

        return AE::cv; # nop
    };

t/condvar/any.t  view on Meta::CPAN

use strict;
use warnings;
use Data::Monad::CondVar;
use Test::More;

sub capture_warn(&) {
    my $code = shift;
    my @warns;
    local $SIG{__WARN__} = sub { push @warns, @_ };

    $code->();

    return @warns;
}

{

t/condvar/cancel.t  view on Meta::CPAN

use strict;
use warnings;
use Data::Monad::CondVar;
use Test::More;

sub _after_dot_4(&) {
    my $code = shift;
    return cv_unit->sleep(.04)->flat_map(sub {
        cv_unit->sleep(.04)->map($code);
    });
}

subtest 'flat_map_and_sleep' => sub {
    {
        my $shouldnt_reach;
        my $cv = _after_dot_4 { $shouldnt_reach++ };



( run in 1.094 second using v1.01-cache-2.11-cpan-49f99fa48dc )