package Data::Enumerator::Where;
use strict;
use warnings;
use List::MoreUtils qw/all natatime/;
use base qw/Data::Enumerator::Base/;
sub iterator {
my ( $self ) = @_;
my ($object,$filter ) = @{$self->object};
my $object_iterator = $object->iterator;
return sub{
while(1){
my $value = $object_iterator->();
return $self->LAST if $self->is_last( $value );
my $result = $filter->($value);
return $self->LAST if $self->is_last( $result );
return $value if $result;
}
};
}
sub __compose_filter {
my ( $filter ) = @_;
return $filter if ref $filter eq 'CODE';
my $iter = natatime(2,@$filter);
my @funcs;
while( my ( $column , $expression ) = $iter->() ){
my $sub = sub {
my $value = shift;
my $target = $value->{$column};
return ($target == $expression );
};
push @funcs,$sub;
}
return sub {
my @request = @_;
all{ $_->(@request)} @funcs
}
}
1;