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 )