Data-Monad

 view release on metacpan or  search on metacpan

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

    };

    $self_duplexed->flatten;
}

sub ap { (ref $_[0])->map_multi(sub { my $c = shift; $c->(@_) } => @_) }

sub while {
    my ($self, $predicate, $f) = @_;

    my $weaken_loop;
    my $loop = sub {
        my @v = @_;
        $predicate->(@v) ? $f->(@v)->flat_map($weaken_loop)
                         : (ref $self)->unit(@v);
    };
    Scalar::Util::weaken($weaken_loop = $loop);

    $self->flat_map($loop);
}

1;

__END__

=head1 NAME

lib/Data/Monad/Base/Sugar.pm  view on Meta::CPAN

package Data::Monad::Base::Sugar;
use strict;
use warnings;
use Scalar::Util qw/blessed weaken/;
use Exporter qw/import/;

our @EXPORT = qw/pick satisfy yield let/;

our $_PICK = our $_SATISFY = 
    our $_YIELD = our $_LET = sub { die "called outside for()." };
sub pick($;$)  { $_PICK->(@_)    }
sub satisfy(&) { $_SATISFY->(@_) }
sub yield(&)   { $_YIELD->(@_)   }
sub let($$)    { $_LET->(@_)     }

lib/Data/Monad/Base/Sugar.pm  view on Meta::CPAN

        } elsif (@blocks) {
            my $retained_loop = $weak_loop;
            return $m->flat_map(sub {
                _capture @_ => $ref;
                $retained_loop->(@blocks);
            });
        } else {
            return $m;
        }
    };
    weaken($weak_loop = $loop);

    return $loop->(@blocks);
}

1;

__END__

=head1 NAME



( run in 0.536 second using v1.01-cache-2.11-cpan-65fba6d93b7 )