Hyperman

 view release on metacpan or  search on metacpan

xs/future.xs  view on Meta::CPAN

        hmf_await(aTHX_ self);
        RETVAL = SvREFCNT_inc(self);
    OUTPUT:
        RETVAL

void
get(self)
    SV *self
    ALIAS:
        result = 1
    PPCODE:
    {
        IV st;
        PERL_UNUSED_VAR(ix);
        hmf_await(aTHX_ self);
        st = hmf_state(aTHX_ self);
        if (st == HMF_FAILED) {
            AV *fav = hmf_values_av(aTHX_ self);
            SV **e = fav ? av_fetch(fav, 0, 0) : NULL;
            if (e) croak_sv(sv_mortalcopy(*e));
            croak("Failed");

xs/future.xs  view on Meta::CPAN

                XPUSHs(e ? sv_mortalcopy(*e) : &PL_sv_undef);
            } else {
                XPUSHs(&PL_sv_undef);
            }
        }
    }

void
failure(self)
    SV *self
    PPCODE:
    {
        hmf_await(aTHX_ self);
        if (hmf_state(aTHX_ self) != HMF_FAILED) XSRETURN_EMPTY;
        {
            AV *fav = hmf_values_av(aTHX_ self);
            SSize_t n = fav ? av_len(fav) + 1 : 0;
            if (GIMME_V == G_ARRAY) {
                SSize_t i;
                EXTEND(SP, n);
                for (i = 0; i < n; i++) {

xs/future.xs  view on Meta::CPAN

                SV **e = av_fetch(fav, 0, 0);
                XPUSHs(e ? sv_mortalcopy(*e) : &PL_sv_undef);
            }
        }
    }

# result/failure values as a plain list, no dying, no awaiting.
void
_values(self)
    SV *self
    PPCODE:
    {
        AV *rav = hmf_values_av(aTHX_ self);
        SSize_t i, n = rav ? av_len(rav) + 1 : 0;
        EXTEND(SP, n);
        for (i = 0; i < n; i++) {
            SV **e = av_fetch(rav, i, 0);
            PUSHs(e ? sv_mortalcopy(*e) : &PL_sv_undef);
        }
    }



( run in 0.649 second using v1.01-cache-2.11-cpan-92ad3014f07 )