Iterator-Flex
view release on metacpan or search on metacpan
lib/Iterator/Flex/Sequence.pm view on Meta::CPAN
package Iterator::Flex::Sequence;
# ABSTRACT: Numeric Sequence Iterator Class
use v5.28;
use strict;
use warnings;
use experimental 'signatures', 'postderef';
our $VERSION = '0.34';
use Scalar::Util;
use List::Util;
use parent 'Iterator::Flex::Base';
use Iterator::Flex::Utils qw( STATE :IterAttrs throw_failure );
use namespace::clean;
sub new ( $class, @args ) {
my $pars = Ref::Util::is_hashref( $args[-1] ) ? pop @args : {};
throw_failure( parameter => q{incorrect number of arguments for sequence} )
if @args < 1 || @args > 3;
my %state;
$state{step} = pop @args if @args == 3;
$state{end} = pop @args;
$state{begin} = pop @args;
$class->SUPER::new( \%state, $pars );
}
sub construct ( $class, $state ) {
throw_failure( parameter => "$class: arguments must be numbers\n" )
unless List::Util::all { Scalar::Util::looks_like_number( $_ ) };
my ( $begin, $end, $step, $iter, $next, $current, $prev )
= @{$state}{qw[ begin end step iter next current prev ]};
my $self;
my $iterator_state;
my %params;
if ( !defined $step ) {
$begin = 0 unless defined $begin;
$next = $begin unless defined $next;
%params = (
( +NEXT ) => sub {
if ( $next > $end ) {
$prev = $current
unless $self->is_exhausted;
return $current = $self->signal_exhaustion;
}
$prev = $current;
$current = $next++;
return $current;
},
( +FREEZE ) => sub {
return [
$class,
{
begin => $begin,
end => $end,
prev => $prev,
current => $current,
next => $next,
},
];
},
);
}
else {
throw_failure(
( run in 0.876 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )