Data-Monad
view release on metacpan or search on metacpan
lib/Data/Monad/Base/Sugar.pm view on Meta::CPAN
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->(@_) }
sub _capture {
my $ref = pop;
return $ref->capture(@_) if blessed $ref && $ref->can('capture');
ref $ref eq 'ARRAY' ? (@$ref = @_) : ($$ref = $_[0]);
}
sub _tuple { bless [@_], 'Data::Monad::Base::Sugar::Tuple' }
sub Data::Monad::Base::Sugar::Tuple::capture {
my ($self, $result) = @_;
blessed $result && $result->isa(ref $self)
or die "[BUG]result is not tuple";
_capture @{$result->[$_]} => $self->[$_] for 0 .. $#$self;
}
sub for(&) {
my $code = shift;
my @blocks;
{
local $_PICK = sub {
my ($ref, $block) = @_;
$block = $ref, $ref = undef unless defined $block;
push @blocks, {ref => $ref, block => $block};
};
lib/Data/Monad/List.pm view on Meta::CPAN
use Exporter qw/import/;
use base qw/Data::Monad::Base::MonadZero/;
our @EXPORT = qw/scalar_list list_unit list_zero list_flat_map_multi
list_map_multi list_sequence/;
sub scalar_list(@) { __PACKAGE__->new(map { [$_] } @_) }
sub list_unit { __PACKAGE__->unit(@_) }
sub list_zero { __PACKAGE__->zero(@_) }
sub list_flat_map_multi(&@) { __PACKAGE__->flat_map_multi(@_) }
sub list_map_multi(&@) { __PACKAGE__->map_multi(@_) }
sub list_sequence { __PACKAGE__->sequence(@_) }
sub new {
my $class = shift;
bless [@_], $class;
}
sub unit {
my $class = shift;
$class->new([@_]);
( run in 0.938 second using v1.01-cache-2.11-cpan-49f99fa48dc )