package Data::Range::Compare::Stream::Iterator::Validate;
use strict;
use warnings;
use Carp qw(croak);
use base qw(Data::Range::Compare::Stream::Iterator::Base);
sub new {
my ($class,$it,%args)=@_;
croak 'Iterator is a required argument' unless defined($it);
my $self=$class->SUPER::new(iterator=>$it,%args);
$self;
}
sub prepare {
my ($self)=@_;
return 1 if defined($self->{next_valid_range});
my $it=$self->{iterator};
while($it->has_next) {
my $next=$it->get_next;
if($next->get_common->boolean) {
$self->{next_valid_range}=$next;
return 1;
}
$self->on_bad_range($next)
}
0;
}
sub on_bad_range {
my ($self,$range)=@_;
$self->{on_bad_range}->($range) if defined($self->{on_bad_range});
}
sub has_next {
my ($self)=@_;
$self->prepare;
}
sub get_next {
my ($self)=@_;
my $range=$self->{next_valid_range};
$self->{next_valid_range}=undef;
return $range;
}
1;