List-Gen
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/List/Gen.pm view on Meta::CPAN
)
}
Carp::croak "arg 1 to ->hyper(str, val) must match (<<|>>)op(<<|>>)";
}
goto &List::Gen::Hyper::hyper if @_ == 5;
Carp::croak q{takes 1 `->hyper('-')` or 2 `->hyper('<<+>>', 1)` }.
q{or 4 `->hyper(qw(<< + >>), 1)` args, not }.$#_
}}
for my $proxy (qw(apply purge rewind)) {
no strict 'refs';
*$proxy = sub {
my @src;
my @todo = tied @{$_[0]};
while (my $next = shift @todo) {
unshift @src, $next;
next if ref($next) =~ /^List::Gen::While/;
if (my $source = $next->source) {
unshift @todo, ref $source eq 'ARRAY'
? @$source
: $source
}
}
($_->can($proxy) or next)->($_) for @src;
$_[0]
}
}
sub is_inf {$_[0]->size >= 9**9**9}
sub x_xs {$_[0]->head, $_[0]->tail}
sub idx {$_[0]->drop( $_[0]->index + 0 )}
sub tee {
my @ret;
for (shift) {
for my $code (@_)
{push @ret, $code->()}}
wantarray
? @ret
: @ret > 1
? &List::Gen::makegen(\@ret)
: pop @ret
}
BEGIN {
*from_index = *idx;
*s = *self = *scalar = sub {$_[0]}
}
sub type {(my $t = ref tied @{$_[0]}) =~ s/::_\d+$//; $t}
sub elems {$_[0]->size}
sub end {$_[0]->apply->size - 1}
{package
List::Gen::DwimCode;
my %save;
sub new {
my ($class, $gen) = @_;
my $code = \&$gen;
bless $code => $class;
$save{$code} = $gen;
$code
}
sub DESTROY {
delete $save{$_[0]}
}
}
sub code {List::Gen::DwimCode->new($_[0])}
sub size_from {
List::Gen::tiegen(Size_From => map tied @$_ => @_)
}
List::Gen::generator Size_From => sub {
my ($class, $self, $from) = @_;
List::Gen::curse {
fsize => $from->can('fsize'),
FETCH => $self->can('FETCH'),
source => sub {[$self, $from]},
$from->mutable ? (mutable => sub {1}) : ()
} => $class
};
sub defined {$_[0]->grep('defined')}
sub iterator {$_[0]->index; $_[0]->can('next')}
BEGIN {*iter = *iterator}
sub range {&List::Gen::range(0, $_[0]->size - 1)}
{no warnings 'once';
*keys = sub {wantarray ? $_[0]->range->all : $_[0]->range};
*values = sub {wantarray ? $_[0]->all : $_[0]};
}
sub kv {&List::Gen::zip($_[0]->range, $_[0])}
sub tuples {&List::Gen::tuples}
sub pairs {$_[0]->range->tuples($_[0])}
sub sort {
my $self = shift;
@_ == 2 and return $self->wrapsort(@_);
@_ == 0
? wantarray ? sort $self->all
: $l2g->(sort $self->all)
: do {
my $code = pop;
$code->$sv2cv;
my ($ca, $cb) = $code->$cv_ab_ref;
local (*$ca, *$cb) = (*a, *b);
wantarray ? sort $code $self->all
: $l2g->(sort $code $self->all)
}
}
{package
List::Gen::Wrap;
use overload fallback => 1, '""' => sub {$_[0][1]};
}
sub wrap {
my ($gen, $code) = splice @_;
$code->$sv2cv;
$l2g->(map {bless [$_ => &$code] => 'List::Gen::Wrap'} $gen->all)
}
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.819 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )