package Data::Enumerator::Range;
use strict;
use warnings;
use base qw/Data::Enumerator::Base/;

sub new {
    my ( $class, $start, $end, $succ ) = @_;
    return bless {
        start => $start,
        end   => $end,
        succ  => $succ,
    }, $class;
}

sub iterator {
    my ( $self ) = @_;
    my $counter = $self->{start};
    my $end     = $self->{end};
    my $succ    = $self->{succ};
    my $succ_func = (ref $succ) ? $succ : sub{ $_[0]+$succ};
    return sub{
        return $self->LAST if $counter >= $end;
        my $prev = $counter;
        $counter = $succ_func->($counter);
        return $prev;
    };
}
1;