Acme-IEnumerable
view release on metacpan or search on metacpan
lib/Acme/IEnumerable.pm view on Meta::CPAN
my $key = $key_extractor->($_);
if (not @list or $key ne $list[-1]->{key}) {
push @list, {
key => $key,
};
}
push @{ $list[-1]->{value} }, $_;
}
my @temp = map {
Acme::IEnumerable::Grouping->from_list($_->{key}, @{ $_->{value} })
} @list;
return Acme::IEnumerable->from_list(@temp)->new;
};
}
sub skip {
my ($self, $count) = @_;
return _create sub {
return sub {
state $base = $self->new();
state $left = $count;
while ($left) {
my $item = $base->();
return unless ref $item;
$left--;
}
return $base->();
};
};
}
sub skip_while {
my ($self, $predicate) = @_;
return _create sub {
return sub {
state $base = $self->new();
state $skip = 1;
while ($skip) {
my $item = $base->();
return unless ref $item;
local $_ = $$item;
$skip &= !! $predicate->($_);
return $item unless $skip;
}
return $base->();
};
}
}
sub element_at {
my ($self, $index) = @_;
Carp::cluck "Index out of range for element_at" if $index < 0;
my $base = $self->new();
while (1) {
my $item = $base->();
do {
use Data::Dumper;
warn Dumper[$self->count(sub { warn Data::Dumper::Dumper($_); 1; })];
Carp::cluck "Index out of range for element_at";
} unless ref $item;
return $$item unless $index--;
}
Carp::confess("Impossible");
}
sub last {
my ($self) = @_;
my $base = $self->new();
my $last;
while (1) {
my $item = $base->();
croak unless ref $item or ref $last;
return $$last unless ref $item;
$last = $item;
}
Carp::confess("Impossible");
}
sub first {
$_[0]->element_at(0);
}
sub first_or_default {
my ($self, $default) = @_;
my $base = $self->new();
my $item = $base->();
return $default unless ref $item;
return $$item;
}
sub last_or_default {
my ($self, $default) = @_;
my $base = $self->new();
my $item = $base->();
return $default unless ref $item;
while (1) {
my $next = $base->();
return $$item unless ref $next;
$item = $next;
}
}
sub count {
my ($self, $predicate) = @_;
$predicate //= sub { 1 };
my $base = $self->new();
while (1) {
my $counter = 0;
my $item = $base->();
return $counter unless ref $item;
local $_ = $$item;
$counter += 0 + !! $predicate->($_);
}
Carp::confess("Impossible");
}
sub select {
my ($self, $projection) = @_;
( run in 1.449 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )